Git-поддерево без сквоша: посмотреть журнал

Я слил дерево в свой репозиторий, используя git subtree add без опции squash. Журнал Git показывает, что коммиты были успешно добавлены в хранилище. Однако, если я сделаю git log --follow filename, история останавливается на слиянии и не показывает предыдущие коммиты. Я пытался с помощью -M вместо --follow и это тоже не работает. Как я могу получить журнал коммитов для определенного файла или файлов до слияния?

2 ответа

Решение

На самом деле, git log --follow должен работать с объединениями поддеревьев, но известно, что он долгое время был хакерским [1-3].

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

Альтернативы и обходные пути

Вы можете получить журналы для файлов, как это [1]:

git log -- '*filename'          # from the toplevel

Это просматривает каждый коммит, который коснулся файла, имя которого заканчивается filename, Он не будет следовать реальным переименованиям и может показывать ложное срабатывание, если у вас есть несколько файлов с одинаковым базовым именем [1].

Вы также можете объединить репозитории, используя разные стратегии. Ссылка [4] показывает способ сделать это, который очень близок к тому, что вы имеете с обычным слиянием поддеревьев, но с отслеживаемой историей. По сути, вы:

  1. добавлять, извлекать и объединять каждый вложенный репозиторий с хранилищем верхнего уровня как обычный удаленный, без поддельного git или readtree. Во-первых, это приведет к тому, что ваш корневой каталог будет удален, как если бы он был их, так что это должно быть сделано в начале жизни проекта.
  2. git mv файлы суб-репо в отдельные папки

Затем:

  • изменения вверх по течению могут быть получены и объединены как обычно, но с -Xsubtree флаг для мерзкого слияния.
  • другие случаи должны быть похожими. Я протестировал продвижение вверх по течению, и это работает, см. Комментарий в [4].

Рекомендации

[1] Из списка рассылки git http://git.661346.n2.nabble.com/Bug-Files-are-losing-history-after-subtree-merge-td7597197.html

[2] Из списка рассылки git http://git.661346.n2.nabble.com/gsoc-Better-git-log-follow-support-td6188083.html

[3] git log --follow был в Google Summer of Code https://git.wiki.kernel.org/index.php/SoC2011Ideas

[4] https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history

Коммит, созданный git subtree merge или же git subtree add делает "add" для файлов, поступающих из поддерева, а не "move". Это означает, что их история не может быть отслежена как с другими слияниями или движениями.

Историю нужного файла можно по-прежнему отображать, просматривая непосредственно в поддереве перед слиянием. Если ваше рабочее пространство является коммитом слияния, git subtree создал тогда второй родитель этого (HEAD^2) будет последним коммитом исходного поддерева. Отсюда вы можете увидеть содержимое исходного поддерева:

# Display the contents of the original subtree
git ls-tree HEAD^2

С помощью этого коммита вы можете отслеживать изменения интересующего вас файла. Будьте осторожны, так как путь к вашему файлу будет отличаться в поддереве вашего рабочего пространства. Вам нужно будет удалить --prefix дано git subtree для того, чтобы иметь правильный путь для вашего файла.

git log HEAD^2 --follow -- path-in-subtree/file
Другие вопросы по тегам