我想将远程 git 存储库合并到我的工作 git 存储库中作为它的子目录。我希望生成的存储库包含两个存储库的合并历史记录,并且合并存储库的每个文件都保留其历史记录,就像在远程存储库中一样。我尝试使用子树策略,如中提到的如何使用子树合并策略,但是在执行该过程之后,尽管生成的存储库确实包含两个存储库的合并历史记录,但来自远程存储库的单个文件并未保留其历史记录(其中任何一个上的“git log”仅显示一条消息“合并分支” ...”)。
另外,我不想使用子模块,因为我不想再将两个组合的 git 存储库分开。
是否可以将远程 git 存储库作为子目录合并到另一个远程存储库中,并保留来自远程存储库的各个文件并保留其历史记录?
非常感谢您的帮助。
编辑:
我目前正在尝试一种使用 git filter-branch 重写合并存储库历史记录的解决方案。它似乎确实有效,但我需要再测试一下。我会回来报告我的发现。
编辑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
其中任何一个上仅显示提交消息“将 B 合并为 subdir/Iwant/to/put/B/in 中的子目录”。他们在 B 中的文件历史记录丢失了。
What seems工作(因为我是 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
上面的过滤器分支命令取自git help filter-branch
,其中我只更改了子目录路径。