Как Git записывает (или, скорее, представляет) пути к файлам и имена для своих больших объектов, а затем идентифицирует переименования? - PullRequest
8 голосов
/ 07 мая 2011

Я пытаюсь понять, как git «запоминает» имя файла и его путь, учитывая, что он хранит содержимое файла только в BLOB-объекте.Является ли объяснение в ссылке здесь Абиземом хорошим?(это лучшее, что я когда-либо видел)

Последующий вопрос: как (где) git определяет, когда мы имеем сходство, особенно после обновления 'move' или path-name?(согласно моему подкаталогу Q переименовывается ).Мне нужно иметь возможность поддерживать существующий рабочий процесс, использующий переименования путей, как часть низкоуровневой персональной VCS (у нас есть большая железная VCS для больших выпусков, но ничего для повседневного / круглосуточного использования)

Ответы [ 2 ]

10 голосов
/ 07 мая 2011

git определяет четыре вида объектов (Commit, Tag, Tree, Blob).Каждый объект идентифицируется после хеша его содержимого.

Три объекта, которые связаны с переименованием:

  1. blob: это соответствует зафиксированному файлу, содержимое объекта является сжатым содержимым исходного файла

  2. дерево: соответствует списку каталогов, содержит сопоставление имени файла с другими объектами (либо BLOB-объектами, либо деревьями), а также записывает права доступа

  3. commit: содержит сообщение о коммите, указатель на родительский коммит (ы) (за исключением первого коммита) и объект дерева

Так что при переименованиифайл и зафиксируйте его, создается новый объект дерева (ну, и не один, если он находится в подкаталоге) с новым именем сопоставления для объекта, но объект тот же.

Однако gitне отслеживает переименование, он пытается переоткрыть их, сравнивая содержимое файла.Если два файла действительно похожи, но имеют разные имена, он считает, что это переименование.Это может занять много времени, и, если файлов много, он может потерпеть неудачу.

Редактировать: Посмотрите на Git Community Book, в которой есть действительно хорошее объяснение о том, какинформация о git store.

2 голосов
/ 09 мая 2011

Почему git не «отслеживает» переименования?

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

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

Однако это не означает, что Git не поддерживает переименования.Механизм сравнения в Git поддерживает автоматическое обнаружение переименований, это включается переключателем '-M' для семейства команд git-diff- *.Механизм обнаружения переименования используется git-log (1) и git-whatchanged (1), поэтому, например, 'git log -M' выдаст историю фиксации с информацией о переименовании.Git также поддерживает ограниченную форму слияния через переименования.Два инструмента для назначения blame, git-blame (1) и git-annotate (1), оба используют код обнаружения автоматического переименования для отслеживания переименований.

Как особый случай, в «git log» версии 1.5.3 и более поздних есть опция «--follow», которая позволяет вам следовать за переименованием, когда указан один путь.Почта Линуса на эту тему.

Git имеет команду переименования git mv, но это только для удобства.Эффект неотличим от удаления файла и добавления другого с другим именем и тем же содержанием.

Я удивлен, что никто не связался с Pro Git book .Многие из моих уроков извлечены из этого.

Кроме того, если вы можете получить книгу Version Control with Git, сделайте это.Это очень хорошая книга, особенно для начинающих.
Вот ссылка - Контроль версий с помощью Git .
Существует также Git снизу вверх .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...