Как каждый из этих обработчиков VCS переименовывает?
Я нашел много противоречащей информации о том, что git отслеживает LOC (строки кода) вместо файлов, поэтому переименования не имеют для него никакого значения.
Как каждый из этих обработчиков VCS переименовывает?
Я нашел много противоречащей информации о том, что git отслеживает LOC (строки кода) вместо файлов, поэтому переименования не имеют для него никакого значения.
hg mv
или использовать hg addremove --similarity
для автоматического обнаружения. Были разговоры о добавлении эвристики во время слияния тоже. Git отличается тем, что он не выполняет переименование отслеживания, что означает, что ему не нужно сообщать о переименованиях с помощью команд SCM для выполнения переименования (или запускать autodetection script для отметки переименований перед фиксацией) и не сохраняет такую информацию в репозитории, но она переименовывает обнаружение. Это означает, что он находит переименования, используя эвристический алгоритм схожести на основе имени файла и содержимого файла, как во время слияния, так и для diff при запросе через опцию -M
(или настраивается с помощью опции diff.renames
config).
Преимущества этого метода заключаются в следующем:
Обратите внимание, что фильтрация pathspec не работает с обнаружением переименования; если вы хотите следить за историей файла через переименования, используйте "git log --follow <filename>
"
На практике:
Git автоматически обнаруживает переименования. (Кстати, я слышал утверждения о том, что git может обнаруживать, когда вы перемещаете функцию из одного файла в другой. Мои начальные тесты, похоже, указывают что это не так.)
С Mercurial вы должны явно указывать об именах переименований, либо с помощью hg mv
, либо --similarity
опции hg addremove
, либо TortoiseHg "предположение переименования" или некоторые инструменты, например. VisualHg будет отмечать переименования для вас. Если вы хотите использовать подход git с Mercurial, я написал расширение
Ты слышал правду, вроде.
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).
Еще одна вещь о git, которая еще не упоминалась, помимо использования эвристики для определения того, произошло ли переименование:
Если файл или даже полное дерево каталогов переименовываются, копируются или перемещаются, а ничто под ним не изменяется каким-либо образом, тогда файл или дерево фактически хранятся как один и тот же объект внутри репозитория и не принимают любое дополнительное пространство.
Если вы измените его, он будет сохранен как новый объект, как обычно.
Я не уверен насчет hg и svn, но я подозреваю, что их изменения в списках изменений означают, что они ведут себя по-другому в этом сценарии. Это действительно не влияет на использование, за исключением того, что это может привести к тому, что вы не сможете перемещать или копировать огромные деревья внутри вашего репозитория.
git отслеживает содержимое, а не файлы. im не уверен в mercurial, но svn должно быть явно сказано о переименованиях