Подтвердить что ты не робот

Обработка переименований: svn vs. git vs. mercurial

Как каждый из этих обработчиков VCS переименовывает?

Я нашел много противоречащей информации о том, что git отслеживает LOC (строки кода) вместо файлов, поэтому переименования не имеют для него никакого значения.

4b9b3361

Ответ 1

  • Git не отслеживает переименования вообще, но использует эвристику для повторного обнаружения их во время слияния и т.д.
  • Переименовывается Mercurial tracks (записывается исходная версия и исходный файл) и использует эту информацию во время слияний. Поэтому вам нужно явно указывать hg о переименованиях с помощью hg mv или использовать hg addremove --similarity для автоматического обнаружения. Были разговоры о добавлении эвристики во время слияния тоже.
  • Svn отслеживает переименование, но я не знаю, насколько он хорош с ними во время слияний (никогда не тестировал это).

Ответ 2

Git

Git отличается тем, что он не выполняет переименование отслеживания, что означает, что ему не нужно сообщать о переименованиях с помощью команд SCM для выполнения переименования (или запускать autodetection script для отметки переименований перед фиксацией) и не сохраняет такую ​​информацию в репозитории, но она переименовывает обнаружение. Это означает, что он находит переименования, используя эвристический алгоритм схожести на основе имени файла и содержимого файла, как во время слияния, так и для diff при запросе через опцию -M (или настраивается с помощью опции diff.renames config).

Преимущества этого метода заключаются в следующем:

  • переименования не обязательно должны быть помечены (или обнаружены) явно: переименование может происходить из патча или может быть выполнено vie filemanager или графический интерфейс
  • алгоритм обнаружения сходства может быть улучшен и не был заморожен во время фиксации, как в случае обнаружения переименований для их маркировки перед фиксацией и сохранения этой информации в репозитории; также легче справляться с ошибками обнаружения переименования, если они не заморожены в истории.
  • следует Git ophilosophy, что важно содержание; см., как Git wame (и графические интерфейсы к нему как "git gui wame" ) могут отслеживать движение блоков кода через границы файлов, что более общее, чем переименование файлов.
  • тот же механизм отвечает за обработку переименований во время слияний; использование переименования означает, что это можно сделать для 3 коммитов, которые в итоге основаны на слиянии, и нет необходимости внимательно следить за историей, отмечая каждое переименование - или нераспространенную концепцию канонического имени файла.

Обратите внимание, что фильтрация pathspec не работает с обнаружением переименования; если вы хотите следить за историей файла через переименования, используйте "git log --follow <filename>"

Ответ 3

На практике:

Git автоматически обнаруживает переименования. (Кстати, я слышал утверждения о том, что git может обнаруживать, когда вы перемещаете функцию из одного файла в другой. Мои начальные тесты, похоже, указывают что это не так.)

С Mercurial вы должны явно указывать об именах переименований, либо с помощью hg mv, либо --similarity опции hg addremove, либо TortoiseHg "предположение переименования" или некоторые инструменты, например. VisualHg будет отмечать переименования для вас. Если вы хотите использовать подход git с Mercurial, я написал расширение

Ответ 4

Ты слышал правду, вроде.

Git работает с содержимым файлов, а не с самими файлами, поэтому переименование технически бессмысленно для него. В git переименование выглядит как файл A исчез, а файл B появился с тем же содержимым, что и A. Но git на самом деле очень хорошо разбирается, когда файл действительно был переименован.

Попробуйте: переименуйте файл, затем запустите 'git rm oldname' и 'git add newname', чтобы сообщить git, чтобы выполнить изменения, затем запустите 'git status', чтобы увидеть, что git думает, что это делает - вы увидите, что он сообщает вам, что файл был переименован. Однако я не уверен, что это значит что-то еще. Посмотрите на фиксацию с 'git show', и вы не увидите упоминания о переименовании, просто связка строк, удаленных из одного пути и добавленных к другому.

В качестве альтернативы вы также можете использовать команду git mv 'для переименования файла. Он не меняет того, как git видит операцию, он просто эффективно выполняет "mv oldname newname", "git rm oldname" и "git добавлять новое имя" за один шаг.

Для обзора Mercurial см. ответ tonfa.

SVN, с другой стороны, не может обнаруживать переименования, но должен сообщаться о них с помощью команды "svn mv". Однако, когда сказано, он отслеживает переименование как "первый класс", поэтому при просмотре списка изменений вы увидите, что изменение было переименованием.

Я бы не предложил выбирать SVN над git или меркуриальным, основанным на этой функции. Значительно большие и важные различия между инструментами. Я бы сначала решил, хотите ли вы систему управления распределенной версией (git или mercurial) или централизованную систему управления версиями (svn).

Ответ 5

Еще одна вещь о git, которая еще не упоминалась, помимо использования эвристики для определения того, произошло ли переименование:

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

Если вы измените его, он будет сохранен как новый объект, как обычно.

Я не уверен насчет hg и svn, но я подозреваю, что их изменения в списках изменений означают, что они ведут себя по-другому в этом сценарии. Это действительно не влияет на использование, за исключением того, что это может привести к тому, что вы не сможете перемещать или копировать огромные деревья внутри вашего репозитория.

Ответ 6

git отслеживает содержимое, а не файлы. im не уверен в mercurial, но svn должно быть явно сказано о переименованиях