我有几个项目依赖于同一个库,我想为此维护一个单独的 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文件进行任何更改,那么为什么这里会有冲突呢?
冲突是半空的,就像在这个问题中报告的那样。一切都在单个系统(OS X)中被拉/推,所以我知道那里建议的行尾没有问题。
当然,这是 git-subtree 的常见用例,并且有一个我看不到的简单答案。请帮忙!
编辑:我发现了一个不满意的解决方法:在将更改推送到子树之后,我需要重新运行子树拉取:
project1$ git subtree push --prefix=lib1 /path/to/lib1.git master
project1$ git subtree pull --prefix=lib1 /path/to/lib1.git master
即使没有更改,它也会找到一些东西,并进行合并提交。然后,在其他地方进行了一些更改之后,当我第二次从中央仓库拉出时,冲突就不会发生了。但是如果我在 push 后忘记立即运行 pull,下一次 pull 就会出现这个冲突。
所以现在我的问题是,为什么这行得通?git-subtree 跟踪推送的方式是否存在错误,或者我错过了什么?