Я относительно новичок в git, раньше использовал Subversion.
Я заметил, что большинство графических интерфейсов git и плагинов IDE не могут отображать историю файла, если файл был переименован. Когда я использую
git log --follow
в командной строке я могу видеть весь журнал переименований.
По словам Линуса Торвальдса, переключатель --follow - это угодник "SVN noob", серьезные пользователи git не используют его:
--follow - это полный взлом, предназначенный просто для удовлетворения бывших пользователей SVN, которые в любом случае ничего не знали о таких вещах, как отцовство или красивые графы ревизий.
Это не совсем фундаментально, но текущая реализация «--follow» на самом деле является средством быстрой предварительной обработки, прикрепленным к логике обхода ревизий, а не чем-то действительно целостным.
Он в буквальном смысле был разработан как приятель «SVN noob», а не как «настоящая функциональность git». Идея заключалась в том, чтобы уйти от (сломанного) мышления, которое переименовывает материю в большой картине.
Мой вопрос : как хардкорные пользователи git среди вас получают историю файла, когда он был переименован? Как это сделать «настоящий»?
git mv oldfile newfile
не вызывает переименования должны быть записаны на всех - это точно так же , как удаление одного файла и добавления другого. git только переименовывает и копирует состояние дерева при каждой фиксации постфактум./bin/mv oldfile newfile
), но затем сделаете этоgit add newfile; git rm oldfile
, результат будет неотличим от результатаgit mv oldfile newfile
.git log --follow
немного улучшается с git 2.9 (июнь 2016 г.): см. Мой ответ ниже--color-moved
когда выdiff
.Ответы:
Я думаю, что основная идея, стоящая за точкой зрения Линуса, заключается в том, что - и отнеситесь к этому с долей скепсиса - хардкорных пользователей git никогда не волнует история «файла». Вы помещаете контент в репозиторий git, потому что контент в целом имеет значимую историю.
Переименование файла - это небольшой частный случай перемещения «содержимого» между путями. У вас может быть функция, которая перемещается между файлами, которые пользователь git может отслеживать с помощью «кирки» функционально (например
log -S
).Другие изменения "пути" включают объединение и разделение файлов; git на самом деле не волнует, какой файл вы считаете переименованным, а какой - скопированным (или переименованным и удаленным), он просто отслеживает полное содержимое вашего дерева.
git поощряет мышление «целым деревом», в то время как многие системы управления версиями сильно ориентированы на файлы. Вот почему git чаще обращается к «путям», чем к «именам файлов».
источник
--follow
этого?--follow
оно используется по умолчанию. Я имею в виду, что когда я хочу увидеть историю кода в файле, меня обычно не волнует, был ли файл переименован или нет, я просто хочу увидеть историю кода, независимо от переименований. Так что, на мой взгляд, имеет смысл--follow
использовать значение по умолчанию, потому что меня не интересуют отдельные файлы;--follow
помогает мне игнорировать переименования отдельных файлов, которые обычно не имеют большого значения.У меня точно такая же проблема, с которой столкнулись вы. Несмотря на то, что я не могу вам ответить, я думаю, вы можете прочитать это письмо, которое Линус написал еще в 2005 году, оно очень уместно и может дать вам подсказку о том, как справиться с проблемой:
Я нашел ссылку на это сообщение в блоге, которое также может быть полезно для вас, чтобы найти жизнеспособное решение:
Пожалуйста, держите нас в курсе вашего прогресса в этом вопросе.
источник
--color-moved
факт, Git v2.15 добавляет шаг к этой «идеальной системе отслеживания». Я играл с ним, чтобы увидеть, как он отслеживает перемещенные строки в файле, но случайно понял, что он отслеживает перемещенные строки во всем различии.--follow
может быть неверно (например, если 2 файла имеют одинаковое содержимое или если есть модификация в дополнение к перемещению файла).Вы будете рады узнать, что некоторые популярные инструменты пользовательского интерфейса Git теперь поддерживают это. Доступны десятки инструментов пользовательского интерфейса Git, поэтому я не буду перечислять их все, но, например:
Дополнительная информация об инструментах Git UI:
источник
Примечание: git 2.9 (июнь 2016 г.) немного улучшит "глючный" характер
git log --follow
:См. Commit ca4e3ca (30 марта 2016 г.) Седера Габора (
szeder
) .(Объединено Junio C Hamano -
gitster
- в коммите 26effb8 , 13 апреля 2016 г.)diffcore: исправить порядок итерации идентичных файлов при обнаружении переименования
(обратите внимание на инверсию здесь:,
B/file -> A/file
иA/file -> B/file
)источник
В Linux я убедился, что SmartGit и GitEye могут отслеживать переименования при отслеживании истории конкретного файла. Однако, в отличие от gitk и GitEye, SmartGit показывает отдельное представление файла и представление репозитория (которое содержит структуру каталогов, но не список файлов, содержащихся внутри).
источник