我想在我的工作 git 存储库中合并一个远程 git 存储库作为它的子目录。我希望生成的存储库包含两个存储库的合并历史,并且合并后的存储库的每个文件保留其在远程存储库中的历史。我尝试使用 如何使用子树合并策略中提到的子树策略,但是在遵循了这个过程之后,尽管生成的存储库确实包含了两个存储库的合并历史,但是来自远程存储库的单个文件没有保留它们的历史(其中任何文件上的‘ git log’只显示了一条消息“合并分支... ...”)。
另外,我不想使用子模块,因为我不希望这两个组合的 git 存储库再次分开。
是否有可能将远程 git 存储库合并到另一个存储库中作为子目录,并将来自远程存储库的单个文件保留其历史记录?
非常感谢你的帮助。
编辑: 我目前正在尝试使用 git 过滤器分支来重写合并的存储库历史的解决方案。看起来确实有效,但我需要再试一下。我会回来报告我的发现。
编辑2: 为了让自己更加清楚,我给出了使用 git 的子树策略时使用的确切命令,这导致远程存储库文件的历史记录明显丢失。 设 A 是我目前正在处理的 git 回购,B 是我想合并到 A 中作为其子目录的 git 回购。它做到了以下几点:
git remote add -f B <url-of-B>
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."
在这些命令之后,进入 subdir/Iwant/to/put/B/in 目录,我看到了 B 的所有文件,但是其中任何一个文件上的 git log
只显示提交消息“ Merge B as subdirectory in subdir/Iwant/to/put/B/in。”他们的文件历史,因为它是在 B 丢失。
看起来的工作原理(因为我是 git 的初学者,所以我可能是错的)如下:
git remote add -f B <url-of-B>
git checkout -b B_branch B/master # make a local branch following B's master
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
git checkout master
git merge B_branch
上面的 filter-Branch 命令取自 git help filter-branch
,在 git help filter-branch
中,我只更改了 subdir 路径。