我们一直在尝试让git-subtree在一个项目上工作(使用git版本1.7.9.4),遇到了一点复杂的情况。其他人在几个月前用这个命令添加了子树:
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
版本,并获得接近最后一个版本的输出。如果我们必须始终使用最后一个版本,我们会继续使用,但我有点困惑,为什么最后一个版本不会产生合并冲突,而中间一个会产生合并冲突。
任何帮助都很感激。
5条答案
按热度按时间relj7zay1#
我也遇到了同样的问题,在我的例子中,这似乎是由于最初的子树提交被合并压缩到主分支中。
通过查找子树源代码,我发现了以下内容:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L224
看起来subtree greps了你的git日志,但是没有找到合适的提交。试试
git log --grep="git-subtree-dir: foo/*\$"
,如果那个提交有什么奇怪的地方,比如它是一个合并提交,那可能就是问题所在。除了烦人的合并冲突外,我只使用拉取而不压缩。我在一个临时分支中这样做,然后将
git merge --squash
插入另一个分支,以避免更混乱的历史。当然,它也可以被重新定基。zvokhttg2#
我在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的命令行处理引擎还有一些工作要做。
5hcedyr03#
如果当前克隆是部分克隆(例如,使用
--depth=1
时),也会发生这种情况。这是GitHub Actions V2的默认设置。在GitHub操作的情况下,这可以在结账步骤使用
fetch-depth: 0
时配置:字符串
envsm3lx4#
当主仓库和子树仓库有不同的提交集时,可能会发生这种情况。
在我的例子中,我已经从本地仓库更新了子树(使用
git subtree pull --squash -P foo local/foo.git master
),本地仓库的更改从未被推送到origin。当我在这之后尝试
git pull --squash -s subtree [[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection) :foo.git master
时,我开始得到错误。只需推送子树存储库即可解决此错误。
mnowg1ta5#
另一种可能发生这种情况的情况是,如果这个存储库是使用
git filter-repo --subdirectory-filter subdir
从另一个存储库“提取”的。在这种情况下,删除子树并再次添加它对我很有效。