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

时间:2012-10-25 01:28:59

标签: git

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

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"
但是,似乎存在微妙的问题。当我做的时候

git log dir-B/

结果只是“合并B项目作为我们的子目录”消息。如何获取所需的日志信息,即导入的dir-B历史记录?

2 个答案:

答案 0 :(得分:4)

您的合并提交会在example.txt中显示BProject/master,并重命名为dir-B/example.txt。除非使用git log选项,否则--follow不会跟踪文件/目录过去重命名的历史记录:

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

如果您真的非常渴望正确显示差异,您可以重写Bproject/master历史记录,就好像项目一直位于目录dir-B中,然后进行普通合并。这意味着合并历史的SHA与Bproject/master上的SHA无关!时间戳,作者和提交消息都将保留其原始值。

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

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

在您确认新历史记录看起来正确之后,您可以将重写的版本作为遥控器添加到主项目中,并使用普通合并将其合并。

答案 1 :(得分:0)

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

(在git-sh工作我可以省略领先的' git'命令)

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

之后我同时拥有:新子目录中的单个文件的历史记录,就像它们一直在那里一样,以及主目录中的正常历史记录,就好像子目录中的新文件一直是那里。 (正如你所看到的,没有必要使用read-tree或任何其他日常使用的命令,' filter-branch'完成整个技巧。)IDE能够(分别应该是;成功测试了PyCharm)与结果一起正常工作。

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

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