我有几个项目依赖于同一个库,我想为每个项目维护一个单独的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
现在我正在项目1上工作,在这个过程中,我对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.
发生了什么?我可以肯定地说,在项目2下的任何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
虽然没有进行更改,但git-subtree在合并提交时会找到一些内容。然后,在其他地方进行了一些更改之后,下一次从中央仓库pull时就不会发生冲突。但是,如果我忘记立即运行pull,那么下一次pull将会出现冲突。
因此,我的问题是,这是为什么?是git-subtree跟踪推送的方式存在错误,还是我漏掉了什么?