在单个存储库中管理多个项目的方法之一可以通过 Git Subtree 合并来完成。
通常,子树合并策略用于在存储库中包含存储库。
子树合并策略
Git Subtree 允许将一个存储库作为子目录嵌套在另一个存储库中。
它是跟踪软件依赖关系历史的方法之一。
但是子树不应该与子模块混淆。
子树只是一个可以与项目一起提交、分支和合并的子目录。
在与 Git 执行合并时使用子树合并策略。
将分支合并到 git 存储库的子目录时很有用。
子树合并策略将子项目的历史与项目的历史结合起来,而子项目的历史可以保持干净,除了应该到上游的提交。
将项目合并到单个存储库的步骤
让我们一步一步地将项目合并到一个存储库中:
初始化目录
首先,打开终端并创建一个目录并导航到它:
mkdir test cd test
设置新的存储库
然后,使用 git init 生成一个新的 git 存储库。
使用此命令,将创建一个 .git 子目录,其中包含元数据,例如对象的子目录和用于初始化新存储库的模板文件:
git init Initialized empty git repository in /Users/octocat/tmp/test/.git/
创建并提交新文件
接下来,我们应该创建并提交一个新文件,如下所示:
touch .gitignore git add .gitignore git commit -m "initial commit"
添加一个新的存储库作为子树
现在,是时候添加一个新的存储库作为子树了。
使用 git remote 命令添加一个指向我们想要的单独项目的新远程 URL:
git remote add -f example git@github.com:exmaple/Example.git
该示例是我们在示例存储库中合并的子树。
合并存储库
现在,我们可以将 Example 项目 git 合并到本地 Git 项目中,这不会更改本地的任何文件。
对于 Git 2.9 或者更高版本,请运行以下命令:
git merge -s ours --no-commit --allow-unrelated-histories example/master
Automatic merge went well; stopped before committing as requested.
默认情况下, git merge 命令拒绝合并不共享共同祖先的历史。
--allow-unrelated-histories 选项用于在合并两个项目的历史时覆盖此安全性。
对于 Git 2.8 或者以下版本,请运行:
git merge -s ours --no-commit example/master
Automatic merge went well; stopped before committing as requested.
将历史复制到文件夹中
新建一个名为Example的文件夹,将Example项目的Git历史复制进去:
git read-tree --prefix=example/-u example/master
提交更改
提交更改以确保项目安全:
git commit -m "Subtree merged in example"
[master ge1cf26] Subtree merged in example
将子树与更新同步
最后一步是将子树与更新和更改同步,因为它不会与上游更改保持同步。
使用 -s 选项执行 git pull 命令:
git pull -s subtree example master