如何将一个git仓库永久合并到另一个仓库?[replicate]

5us2dqdw  于 2023-03-21  发布在  Git
关注(0)|答案(2)|浏览(205)

此问题在此处已有答案

How do you merge two Git repositories?(26个答案)
3天前关闭。
我有一个git仓库,它包含在另一个git仓库中;我怎样才能在保持提交历史的情况下将内部文件永久地合并到外部文件中呢?为了更好地说明,下面是我的目录结构:

[dev]
  > [ext]
        ...
  > [libs]
        ...
  > [tools]
        ...

dev是我的git仓库A的根目录,它通过 .gitignore 规则排除了ext目录中的所有内容。而ext则是我的git仓库B的根目录。我希望只保留仓库A,并让它包含dev下的所有内容,包括ext的内容,同时将B的提交历史合并到A中--这样我就有了一个包含所有内容以及A和B的所有历史的存储库。
不涉及子模块;存储库的分离仅通过外部存储库上的排除规则来完成。
做这件事的最好方法是什么?

uz75evzq

uz75evzq1#

moving开始,将存储库B的内容(在ext中)转移到存储库中的新ext目录(即<project>/ext/ext)。

$ cd ./ext
$ mkdir ext
$ for f in *; do git mv "$f" "./ext/$f"; done

这样,在下一步中,存储库B的历史将“记住”它的源代码树属于ext目录。
不要忘记提交此更改。
之后,你可以进入仓库A(根项目),将仓库B添加为远程仓库,获取它的不相关历史,然后创建一个继承自两个修订历史的合并提交。请注意,你需要将--allow-unrelated-histories传递给git-merge以允许不相关历史的合并。
默认情况下,git merge命令拒绝合并没有共同祖先的历史。当合并两个独立开始的项目的历史时,可以使用此选项来覆盖此安全性。
总的来说,这些是要运行的命令:

# Add "repo B" as a remote of "repo A"
$ git remote add ext_repo ./ext

# Fetch the unrelated history of "repo B"
$ git fetch ext_repo

# Create a commit with parents from both repos histories.
$ git merge --allow-unrelated-histories ext_repo/main
pod7payv

pod7payv2#

首先,备份。其次,将ext中的所有内容推送到B

cd ext
git push --all origin
cd ..

删除子目录ext,并从.gitignore中删除它:

rm -rf ext
`git var GIT_EDITOR` .gitignore

现在使用git subtreeB导入到A中:

git subtree add --prefix=ext URL-for-B master # or whatever branch you want to import

相关问题