我们一直试图让git-subtree处理一个项目(使用git版本1.7.9.4)并且遇到了一些复杂问题。几个月前,其他人之前使用此命令添加了子树:
git subtree add --prefix=foo git@example.com:foo.git master
现在foo
已经发生了实质性的变化,我们希望合并这些变化,最好将它们压缩。自导入文件以来,没有任何文件被修改过。
我已尝试过三件事来尝试合并这些变化。
首先:
git subtree pull --squash -P foo git@example.com:foo.git master
抛出异常:Can't squash-merge: 'foo' was never added.
第二
git subtree pull -P foo git@example.com:foo.git master
这可以(有点),但是有拉入所有提交的问题,并且与已修改的文件有冲突。
最后,我尝试了这个:
git pull --squash -s subtree git@example.com:foo.git master
这为我提供了所需的结果,输出Automatic merge went well; stopped before committing as requested
和所有文件显示为已修改(包含正确的内容)。
理想情况下,我想继续使用第一个git-subtree
版本并获得接近上一版本的输出。如果我们必须一直使用最后一个版本,我们会,但我有点困惑为什么最后一个版本不会产生合并冲突,而中间版本。
感谢任何帮助。
答案 0 :(得分:9)
我有同样的问题,在我的情况下,它似乎是由于初始子树提交被合并压缩到主分支。
通过子树源我找到了这个:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L224
看起来像子树grep你的git-subtree-dir: foo
的git日志,但找不到合适的提交。尝试git log --grep="git-subtree-dir: foo/*\$"
,如果有一些奇怪的提交,例如它是合并提交,那可能就是问题。
除了烦人的合并冲突之外,只是在没有挤压的情况下拉动我。我在一个临时分支中做到了这一点,然后我git merge --squash
进入另一个分支,以避免更糟糕的历史。当然,它也可能已被改造。
答案 1 :(得分:2)
每当我对子树进行拉动时,我一直遇到与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的命令行处理引擎还有一些工作要做。
答案 2 :(得分:0)
如果当前克隆是部分克隆(例如,使用--depth=1
时),也会发生这种情况。这是GitHub Actions V2的默认设置。
对于GitHub操作,可以在结帐步骤中使用fetch-depth: 0
进行配置:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v2
with:
ref: master
fetch-depth: 0
答案 3 :(得分:0)
当主存储库和子树存储库具有不同的提交集时,可能会发生这种情况。
就我而言,我已经使用git subtree pull --squash -P foo local/foo.git master
从本地存储库更新了子树,并且本地存储库的更改从未被推送到源。
此后尝试git pull --squash -s subtree git@example.com:foo.git master
时,我开始收到错误消息。
只需推动子树存储库即可解决该错误。