从中央 repo 中 pull 出时 git-subtree 冲突

标签 git git-subtree

我有几个依赖于同一个库的项目,为此我想维护一个单独的 git 存储库,以便在每个项目中使用 git-subtree 进行管理。因此,例如,在每个项目中我可以做:

project1$  git subtree add --prefix=lib1 /path/to/lib1.git master
project2$  git subtree add --prefix=lib1 /path/to/lib1.git master

现在在处理 project1 的过程中,我对 lib1 做了一些更改,比如 lib1/file1.c,并将其推送回中央仓库:

project1$  git add lib1/file1.c
project1$  git commit -m "updates to lib1"
project1$  git subtree push --prefix=lib1 /path/to/lib1.git master

到目前为止,还不错。但现在我想更新 project2 的 lib1 副本。所以我尝试:

project2$  git subtree pull --prefix=lib1 /path/to/lib1.git master
Auto-merging lib1/file1.c
CONFLICT (content): Merge conflict in lib1/file1.c
Automatic merge failed; fix conflicts and then commit the result.

这是怎么回事?我很确定project2下的lib1文件没有任何变化,所以这里为什么会发生冲突?

冲突是半空的,如 this question 中报告的那样.一切都在单个系统 (OS X) 中被 pull/推,所以我知道那里建议的行结尾没有问题。

这当然是 git-subtree 的常见用例,并且有一个我看不到的简单答案。请帮忙!

编辑:我发现了一个不令人满意的解决方法:将更改推送到子树后,我需要立即重新运行子树 pull :

project1$  git subtree push --prefix=lib1 /path/to/lib1.git master
project1$  git subtree pull --prefix=lib1 /path/to/lib1.git master

即使没有任何变化,它也会找到一些东西,并进行 merge 提交。然后,在其他地方进行一些更改后,我第二次从中央 repo 中 pull 出时不会发生冲突。但是如果我忘记在 push 之后立即运行 pull,那么下一次 pull 就会发生这个冲突。

所以现在我的问题是,为什么这样做有效? git-subtree 跟踪推送的方式是否存在错误,或者我是否遗漏了什么?

最佳答案

实际上,我通过反复试验找到了执行此操作的正确方法。

执行此命令后:

project1$  git subtree push --prefix=lib1 /path/to/lib1.git master

执行一个获取命令:

project2$  git fetch /path/to/lib1.git master

然后做你的 pull :

project2$  git subtree pull --prefix=lib1 /path/to/lib1.git master

关于从中央 repo 中 pull 出时 git-subtree 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17242063/

相关文章:

git.Run() 没有输出

git - 从分支添加 git 子树

Git 子树导出和重新导入问题

Git 在推送代码时返回错误 403

git - 如何将提交从master转移到另一个分支?

Git 子树 merge 策略 - 设置本身如何跨克隆进行?

git - 如何根据 super 项目分支切换子模块分支

git - 如何对子树使用相对 url?

git - 下载没有存储库名称文件夹的 Github .zip

GIT SSH连接问题