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] показывает способ сделать это, который очень близок к тому, что вы имеете с обычным слиянием поддеревьев, но с отслеживаемой историей. По сути, вы:
- добавлять, извлекать и объединять каждый вложенный репозиторий с хранилищем верхнего уровня как обычный удаленный, без поддельного git или readtree. Во-первых, это приведет к тому, что ваш корневой каталог будет удален, как если бы он был их, так что это должно быть сделано в начале жизни проекта.
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
Коммит, созданный 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