3

我使用 Git 书中描述的结构设置了两个存储库:http: //git-scm.com/book/ch6-7.html。基本上,我想在一个 repo 的副本和它的 master 分支之间保持关系。我知道你可以用子模块做到这一点,但更新它们的过程似乎有点麻烦,我被告知(并阅读)子树更容易使用。无论如何,我将“RepoA”设置为其中包含“RepoB”的子树。我按照 T 恤链接中提供的步骤进行操作。

我对“RepoA”中的子树进行了重大修改。同时,我团队的其他人正在对“RepoB”上的master进行修改。当一切都说完了,我希望我可以从“RepoB”源/主节点中提取更改并将它们合并到 RepoA 中的子树中。但是,当我这样做时(使用带有 --squash 和 --no-commit 的 -s 子树合并选项),我对 RepoA 中的子树所做的所有更改都将被删除。甚至我添加到子树的新文件也会被删除!为什么是这样?我误解了子树的使用吗?我是否不正确地合并它?任何帮助将不胜感激!

此外,如果无法将这些与子树合并正确合并,那么我唯一的选择是手动、手动合并它们并创建新的项目结构吗?

谢谢!

4

2 回答 2

0

假设您已经将 RepoB 设置为遥控器,请尝试以下操作:

git merge -s ours --no-commit RepoB/master

更多信息在这里:https ://help.github.com/articles/working-with-subtree-merge

于 2013-04-18T10:21:00.733 回答
0

如果存在 RepoB 子树,则将 RepoB 子树合并到 RepoA 的“git read-tree”步骤不起作用。跳过读取树会导致所有文件都被本地删除。(重来)

RepoB 子树必须从 git 本地删除。之后,git-read-tree 将起作用,并且合并对于文件和历史记录都是正确的。

从具有来自先前合并的 RepoB_subtree 的 RepoA 克隆开始。

git remote add -f RepoB <RepoB-url>
git merge -s ours  --no-commit RepoB/master
git rm -r RepoB_subtree
git read-tree --prefix=RepoB_subtree/ -u RepoB/master
git commit -m "Subtree merge of RepoB/master."

RepoA 历史首先显示整个 RepoB 提交块。以前的子树合并提交显示在 RepoA 中,没有任何 RepoB 历史记录。

RepoA 中 RepoB 历史的组织并不像我预期的那样在时间上是线性的,但回想起来,RepoA 中 RepoB 子树的历史是完整且易于阅读的。

于 2016-03-17T16:58:12.490 回答