执行读取树合并后,Git日志显示很少


Git log shows very little after doing a read-tree merge

因此,我将另一个存储库合并到当前存储库的子目录中,如下所示:

1
2
3
4
git remote add -f Bproject /path/to/B
git merge -s ours --no-commit Bproject/master
git read-tree --prefix=dir-B/ -u Bproject/master
git commit -m"Merge B project as our subdirectory"

不过,似乎有一些微妙的问题。当我这样做的时候

1
git log dir-B/

结果只是"merge b project as our subdirectory"消息。如何获取所需的日志信息,即dir-b的导入历史记录?


合并提交显示BProject/master中的example.txt被重命名为dir-B/example.txt。除非使用了--follow选项,否则git log不会遵循文件/目录的历史记录进行重命名:

1
2
--follow
Continue listing the history of a file beyond renames (works only for a single file).

如果你真的很想正确显示差异,你可以重写BProject/master的历史,就像项目一直在dir-B目录中一样,然后进行一次普通的合并。这就意味着合并后的历史与江户记上的历史没有任何关系。不过,timestamp、author和commit消息都将保留其原始值。

如果您想这样做,我建议先单独克隆Bproject,然后在该克隆中运行:

1
2
3
4
5
6
7
8
git-filter-branch manpage

To move the whole tree into a subdirectory, or remove it from there:
git filter-branch --index-filter \
        'git ls-files -s | sed"s-\t"*-&newsubdir/-" |
                GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                        git update-index --index-info &&
         mv"$GIT_INDEX_FILE.new""$GIT_INDEX_FILE"' HEAD

确认新的历史记录看起来正确后,可以将重写的版本作为远程文件添加到主项目中,并使用普通的合并将其合并。


基于r3m0t重写历史的想法,以下几行为我完成了整个技巧,将另一个git存储库作为新的分支合并到我现有的一个子目录中:

(在git-sh工作时,我可以省略前面的"git"命令)

1
2
3
4
5
6
7
8
9
10
co -b my-new-branch
remote add -f origin-my-old-standalone-project ../my-old-standalone-project/
pull origin-my-old-standalone-project master
mkdir my-new-subdir
ci -am"merge 'old' standalone project as new branch 'my-new-branch'"
git filter-branch --index-filter \
        'git ls-files -s | sed"s%\t"*%&my-new-subdir/%" |
                GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                        git update-index --index-info &&
         mv"$GIT_INDEX_FILE.new""$GIT_INDEX_FILE"' HEAD

在那之后,我有了两个:一个是新子目录中单个文件的历史记录,就像它们一直都在那里一样;另一个是主目录中的正常历史记录,就像子目录中的新文件总是在那里一样。(如您所见,不需要读取树或任何其他非日常使用的命令,"过滤分支"完成了整个技巧。)IDE可以(resp。应该;成功测试了pycharm)才能正常工作。

之后,您应该能够像往常一样合并分支,将所有项目合并为一个项目。

tl;dr:--follow按预期工作,在执行上述6条命令,将旧的git项目合并到其他git项目的新分支和子目录后,历史也正常。