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

12

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

Ваш Ответ

2   ответа
4

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

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

Alternatives and Workarounds

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

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

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

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

  1. add, fetch and merge each sub-repository to the toplevel repository as a regular remote, no git subtree or readtree. At first, this will polute your root dir as if it was theirs, so this is to be done at the beginning of a project's life.
  2. git mv the sub-repo files to separate folders

Затем:

  • upstream changes can be fetched and merged normally, but with the -Xsubtree flag to git merge.
  • other cases should be similar. I've tested pushing upstream and it works, see comment in [4].

References

[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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsaintgimp.org/2013/01/22/… Bryan Larsen
Error: User Rate Limit Exceededgit log --followError: User Rate Limit Exceededgit log --follow .Error: User Rate Limit Exceededgitk --follow .Error: User Rate Limit Exceeded
14

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

Историю нужного файла можно по-прежнему отображать, просматривая непосредственно в поддереве перед слиянием. Если ваше рабочее пространство является коммитом слияния,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
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededalmostError: User Rate Limit Exceeded Bryan Larsen

Похожие вопросы