我们一直在尝试让 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
版本并获得接近上一个版本的输出。如果我们必须始终使用最后一个版本,我们会的,但我有点困惑为什么最后一个版本不会产生合并冲突,而中间版本却会产生合并冲突。
如有任何帮助,我们将不胜感激。
我遇到了同样的问题,就我而言,这似乎是由于初始子树提交被合并压缩到主分支中。
查看子树源代码,我发现了这个: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
。 但是,我相信我的情况有所不同,因为我使用的是子目录。
Sourcetree 执行以下操作:
Can't squash-merge: 'foo' was never added.
显然,如果我们在 Git Bash(Git 版本 2.6.1.windows.1)中再次尝试,结果将是:
git -c diff.mnemonicprefix=false -c core.quotepath=false 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/subdir1 --squash remote-repo master
我猜想 Git 的命令行处理引擎还有一些工作要做。
在我的例子中,我已经从本地存储库更新了子树(使用
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v2
with:
ref: master
fetch-depth: 0
),并且本地存储库更改从未被推送到原点。
当我尝试
git subtree pull --squash -P foo local/foo.git master
之后,我开始收到错误。
只需推送子树存储库即可解决该错误。