git 子树拉取并发症

问题描述 投票:0回答:5

我们一直在尝试让 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
版本并获得接近上一个版本的输出。如果我们必须始终使用最后一个版本,我们会的,但我有点困惑为什么最后一个版本不会产生合并冲突,而中间版本却会产生合并冲突。

如有任何帮助,我们将不胜感激。

git merge git-subtree
5个回答
16
投票

我遇到了同样的问题,就我而言,这似乎是由于初始子树提交被合并压缩到主分支中。

查看子树源代码,我发现了这个: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/*\$"
,如果该提交有一些奇怪的地方,例如它是合并提交,那可能就是问题所在。

除了烦人的合并冲突之外,仅拉动而不挤压对我来说很有效。我在一个临时分支中执行了此操作,然后将其插入另一个分支以避免更混乱的历史记录。当然,它也可以被重新设定。

    


3
投票
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 的命令行处理引擎还有一些工作要做。


2
投票
git subtree pull -P "dir1/subdir" --squash remote-repo master

时),也会发生这种情况。这是

GitHub Actions V2
的默认设置。 对于 GitHub 操作,可以在结帐步骤使用

--depth=1

时进行配置:


fetch-depth: 0



1
投票

在我的例子中,我已经从本地存储库更新了子树(使用

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

之后,我开始收到错误。


只需推送子树存储库即可解决该错误。


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

从另一个存储库“提取”的。

在这种情况下,删除子树并再次添加它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.