2013-03-12 80 views
3

我安装使用Git的书这里所描述的结构的两个仓库:http://git-scm.com/book/ch6-7.html。基本上,我想保持一个回购的副本和它在原产地的主分支之间的关系。我知道你可以用子模块做到这一点,但更新它们的过程似乎有点麻烦,我被告知(并且已经阅读)子树更容易处理。无论如何,我设置了“RepoA”,在其中有一个“RepoB”的子树。我遵循链接中提供的步骤来开球。Git的子树合并消除分支的变化被合并到

我在“RepoA”做出重大修改的子树。与此同时,我的团队中的其他人正在对“RepoB”的主人进行修改。当所有的事情都说完后,我期望我可以从“RepoB”origin/master和subtree中将这些更改合并到RepoA中的子树中。然而,当我这样做(使用带有-s子树合并选项--squash和--no提交),所有我在RepoA的子树所做的更改将被删除。即使添加到子树中的新文件也被删除!为什么是这样?我误解了使用子树吗?我是否合并不当?任何帮助将不胜感激!

此外,如果它不可能有子树合并正确合并这些,是我将它们合并做手工,手工,并创建一个新的项目结构,唯一的选择?

谢谢!

回答

0

的“git的阅读树”步如果RepoB子树存在,那么进入RepoA不起作用。跳过读取树导致所有文件被本地删除。 (重新开始)

的RepoB子树必须git的从被局部除去。在那之后,git-read-tree会工作,合并对于文件和历史都是正确的。

与RepoA与从先前的合并一个RepoB_subtree克隆启动。

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提交块首先显示。以前的子树合并提交显示在没有任何RepoB历史记录的RepoA中。

RepoA中RepoB历史的组织形式与我所预期的并不是线性的,但回想起来,RepoA中的RepoB子树的历史是完整且易于阅读的。