git-subtree pull并发症

tkqqtvp1  于 11个月前  发布在  Git
关注(0)|答案(5)|浏览(120)

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

relj7zay

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插入另一个分支,以避免更混乱的历史。当然,它也可以被重新定基。

zvokhttg

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

5hcedyr0

5hcedyr03#

如果当前克隆是部分克隆(例如,使用--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

字符串

envsm3lx

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时,我开始得到错误。
只需推送子树存储库即可解决此错误。

mnowg1ta

mnowg1ta5#

另一种可能发生这种情况的情况是,如果这个存储库是使用git filter-repo --subdirectory-filter subdir从另一个存储库“提取”的。
在这种情况下,删除子树并再次添加它对我很有效。

相关问题