3

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

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的导入历史?

4

2 回答 2

4

您的合并提交显示example.txtBProject/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 与 上的 SHA 无关Bproject/master!不过,时间戳、作者和提交消息都将保留其原始值。

如果你想这样做,我建议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

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

于 2012-10-25T01:53:36.190 回答
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

之后我拥有了两个:新子目录中的单个文件的历史记录,好像它们一直在那里,以及主目录中的正常历史记录,好像子目录中的新文件一直在那里。(如您所见,不需要读取树或任何其他非日常使用的命令,'filter-branch' 完成了整个操作。)IDE 能够(分别;应该;成功测试 PyCharm)与结果。

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

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

于 2015-03-07T12:01:43.827 回答