合并子目录中的git仓库

我想在我的工作git仓库中合并一个远程git仓库作为它的子目录。我希望生成的存储库包含两个存储库的合并历史记录,并且希望合并后的存储库中的每个文件都保留其历史记录,就像在远程存储库中一样。我尝试使用如何使用子树合并策略中所述的子树策略,但是按照该步骤进行操作后,尽管生成的存储库确实包含两个存储库的合并历史记录,但来自远程文件库的单个文件并未保留其历史记录(其中任何一个上的“ git log”仅显示一条消息“ Merged branch ...”)。

另外,我也不想使用子模块,因为我不想再将两个组合的git存储库分开。

是否可以将远程git存储库作为子目录合并到另一个目录中,而该远程git存储库中的单个文件会保留其历史记录?

非常感谢您的帮助。

编辑:我目前正在尝试使用git filter-branch重写合并的存储库历史记录的解决方案。它似乎确实有效,但我需要对其进行更多测试。我将返回报告我的发现。

编辑2:希望我能更清楚地给出与git的子树策略一起使用的确切命令,这显然会导致丢失远程存储库文件的历史记录。假设A是我当前正在使用的git repo,而B是我想作为其子目录并入A的git repo。它执行以下操作:

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中的文件历史记录丢失了。

什么似乎工作(因为我在混帐初学者我可能是错的)如下:

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,其中我仅更改了subdir路径。

转载请注明出处:http://www.intsu.net/article/20230526/891110.html