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

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

Ответ 1

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

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

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

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

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

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

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

  • добавлять, извлекать и объединять каждый субрепозитор в репозиторий toplevel в виде обычного удаленного, без git поддерева или readtree. Сначала это будет интерпретировать ваш корневой каталог, как если бы он был им, поэтому это должно быть сделано в начале жизненного цикла проекта.
  • git mv файлы субрепо для отдельных папок

Тогда:

  • восходящие изменения могут быть выбраны и объединены нормально, но с флагом -Xsubtree на git слияние.
  • другие случаи должны быть похожими. Я тестировал нажатие вверх по течению, и оно работает, см. Комментарий в [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#a6188352

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

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

Ответ 2

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

История файла, который вы хотите, по-прежнему может отображаться, просматривая непосредственно в поддереве до слияния. Если ваше рабочее пространство является фиксацией слияния, созданной 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