2012-03-19 130 views
15

我们一直试图让git-subtree在一个项目上工作(使用git版本1.7.9.4)并且遇到了一些复杂情况。别人以前添加的子树用这个命令在几个月前:git-subtree pull并发症

git subtree add --prefix=foo [email protected]:foo.git master 

现在已经出现了实质性的变化foo,我们希望在这些变化进行合并,理想的挤压他们的文件无已。自从它们被导入后被修改。

我已经尝试了三件事情来尝试并在变化中合并。

第一:

git subtree pull --squash -P foo [email protected]:foo.git master 

会抛出异常:Can't squash-merge: 'foo' was never added.

二:

git subtree pull -P foo [email protected]:foo.git master 

这工作(在某种程度上),但在所有提交的拉动问题并与已修改的文件发生冲突。

最后,我想这一点:

git pull --squash -s subtree [email protected]:foo.git master 

这给了我想要的结果,与输出Automatic merge went well; stopped before committing as requested和所有的文件显示为修改(与正确的内容)。

理想情况下,我想继续使用第一个git-subtree版本,并获得接近最后一个版本的输出。如果我们必须一直使用最后一个版本,那么我们会这么做,但是我对于为什么最后一个版本不会产生合并冲突而中间产生冲突有点困惑。

任何帮助表示赞赏。

回答

6

我有同样的问题,在我看来,这似乎是由于初始子树提交被合并压入主分支。

通过子树源,我发现这个展望:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L224

它看起来像树里grep你的git日志git-subtree-dir: foo,但没有找到合适的提交。试试git log --grep="git-subtree-dir: foo/*\$",如果这个提交有些奇怪,比如它是一个合并提交,那可能是问题。

除了令人讨厌的合并冲突之外,只要不拔手就可以为我工作。我在一个临时分支中完成了这项工作,然后我将git merge --squash编入了另一个分支,以避免更加混乱的历史。当然,它可能已经被重新设计了。

+1

我遇到了同样的问题,原因是我在尝试拉动时错过了前缀选项中的子文件夹。将此添加为注释,因为错误消息没有给出任何关于此错误的指示,并且故障排除使我在此处找到了答案。 – 2015-12-08 18:25:57

+0

谢谢,这很有用。我有一个相关的问题,在将子树添加到其中后,我移动了该子目录,这看起来好像让这个匹配成功了 – 2017-01-04 21:20:45

1

我每次在子树上执行操作时,都遇到了与sourcetree 1.7.0相同的错误Can't squash-merge: 'foo' was never added.。 但是,我相信我的情况是不同的,因为我使用的是子目录。

Sourcetree做了如下:
git -c diff.mnemonicprefix=false -c core.quotepath=false subtree pull -P dir1\subdir1 --squash remote-repo master

而且很明显,如果我们要在Git中的Bash(GIT版本2.6.1.windows再次尝试。1),它应该是:
git subtree pull -P "dir1\subdir1" --squash remote-repo master

但是失败了。下面也未能虽然命令语法是罚款:
git subtree pull -P dir1/subdir1 --squash remote-repo master

我发现使它工作的解决方案是使用的Git Bash的使用下面的命令:
git subtree pull -P "dir1/subdir" --squash remote-repo master

我想这还是有一些Git的命令行处理引擎需要完成的工作。