2010-12-12 2 views
3

Недавно я начал использовать Git. Одной из интересных особенностей, которые я обнаружил, было использование хешей для быстрого обнаружения изменений.Есть ли попытка разработать файловую систему с автоматической записью файлов?

С другой стороны, я вижу, что инструменты сборки (например, make, ant, javac и т. Д.) Пытаются обнаружить изменения в исходных файлах, проверяя метку времени файла.

Проблемы при таком подходе являются:

  1. Если вы работаете на более чем одной машине, вы должны убедиться, что все часы синхронизированы, в противном случае новый файл можно считать неизменным потому что часы других машин дали ему временную метку прошлого относительно строительной машины.
  2. В большом проекте вам нужно отсканировать метку времени всех файлов, чтобы обнаружить изменение.

Интересно, если кто-то уже приняли подход Git для того, чтобы справиться с этими проблемами:

  1. Каждый файл имеет уникальный хэш, в зависимости от его содержания, а не временной отметки.
  2. Каждый каталог также имеет свой хэш, в зависимости от файлов в каталоге и их хэшей.
  3. Даже простое изменение глубоко внутри дерева исходных текстов приводит к корневой директории, чтобы иметь различный хеш из-за вышеуказанные правила

Такого механизма мог бы помочь сделать инструменты для сборки гораздо быстрее, потому что обнаружение изменения в исходном дереве является простой операцией хэш-сравнения. Если хэш корневого каталога исходного дерева изменился, это означает, что изменение произошло глубже в исходном дереве, поэтому продолжайте сканировать дерево рекурсивно для изменений - точно так же, как Git делает для обнаружения изменений.

Это не обязательно означает, что это исходное дерево должно управляться Git. Моя идея заключается в том, что файловая система автоматически предоставит хэш-код файла как один из его атрибутов/метаданных, поэтому инструмент построения может полагаться на это, а не на метку времени. И, кроме того, хэш каталога автоматически отражает состояние файла в нем.

Я уже немного ознакомился с ZFS Sun, но я не уверен, что это полное решение для быстрого создания сборки.

Что вы думаете об этой идее? Есть ли уже такая файловая система? Есть ли такой инструмент построения?

+0

Я думаю, что основная проблема заключается в том, что файловая система и инструменты сборки (или любые другие инструменты) должны * обе * поддерживать эту функциональность. И это условие может быть выполнено только на некоторых «закрытых» платформах, где одна группа разрабатывает как файловую систему, так и инструменты сборки. –

+0

Я согласен, но как и во всех улучшениях: кто-то должен сделать первый шаг вперед, а остальные присоединятся позже. Можно добавить хэш-сравнение файлов для создания инструмента, как только файловая система поддерживает это. –

+0

Я думаю, что хотя бы make будет иметь проблемы, так как make использует только временные метки файловой системы, чтобы определить, какие цели нужно перестроить. Нужна новая make-подобная программа, которая может обрабатывать контрольные суммы. – Rudi

ответ

2

Я утверждать, что вы пытаетесь решить на самом деле не проблема:

Часы косых проблема может быть в основном избежать, используя NTP.

Конечно, было бы хорошо, если бы проблемы с перекосом в часах были устранены полностью, но мы, вероятно, можем согласиться с тем, что бросать довольно сложную систему отслеживания контента в проблему - это избыток.

Что касается производительности, сканирование всего дерева, как правило, не является проблемой на практике. stat смехотворно быстр (до тех пор, пока вы не в Windows) - ls -lR > /dev/null по всему дереву ядра Linux (файлы 38 тыс.) Занимает 350 мс в моей системе.

Фактически, если статистика всех ваших файлов является проблемой, ваша система управления версиями станет медленной, и это будет гораздо более серьезной проблемой, чем ваша производительность сборки. Каждый git status или git diff, например, статистику все файлов в вашей рабочей копии, чтобы проверить их mtimes, так что вам лучше надеяться, что это быстро.

Итак, если вы хотите ускорить работу make, не смотрите на файловую систему; это, скорее всего, незначительно по сравнению с тем, что на самом деле съедает ваше время сборки.

Надеюсь, что облегчит ваш разум!

+0

Просто имейте в виду, что перекос часов может возникать только при упаковке файлов в ZIP/Jar на одном компьютере и разархивировании на другой машине. Недавно я нашел именно такой сценарий, где временные метки, которые ошибочно в будущем после распаковки, и которые заставили скрипт сборки вести себя по-другому и терпеть неудачу. Контрольная сумма может избежать этой проблемы. Однако я согласен с тем, что с использованием временных меток легко определить «базовый уровень». Используя контрольные суммы, у вас есть только логический флаг «equals/different». –

+0

Это потому, что вы сохраняете даты, а не даете дате создания дату, в которую записываются файлы. – Arafangion

+0

Вы правы, архивы - проблема. Я отредактировал свой ответ, чтобы понять, что NTP - это единственное, что может остановить эти проблемы. Но даже в закрытых сетях вы можете легко установить локальный сервер NTP, чтобы синхронизировать часы, поэтому я думаю, что на практике этого можно избежать, нет? Кстати, если вы хотите сделать автоматизированные процессы надежными, вы также можете использовать -m для tar или -DD для распаковки, чтобы отключить извлечение mtimes (поэтому они настроены на «сейчас»). –

Смежные вопросы