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