У меня есть несколько проектов, которые зависят от одной и той же библиотеки, для которых я хотел бы поддерживать отдельный репозиторий 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
Все идет нормально. Но теперь я хотел бы обновить копию lib1 проекта2. Итак, я пытаюсь:
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.
В чем дело? Я точно знаю, что ни в один из файлов lib1 в проекте2 не было внесено никаких изменений, так почему здесь должен быть конфликт?
Конфликты полупустые, как и те, о которых сообщается в этот вопрос. Все загружается/проталкивается в одной системе (OS X), поэтому я знаю, что нет проблем с окончаниями строк, как это предлагается там.
Конечно, это распространенный вариант использования git-subtree, и у него есть простой ответ, которого я просто не вижу. Пожалуйста помоги!
EDIT: я нашел неудовлетворительный обходной путь: сразу после отправки изменений в поддерево мне нужно повторно запустить извлечение поддерева:
project1$ git subtree push --prefix=lib1 /path/to/lib1.git master
project1$ git subtree pull --prefix=lib1 /path/to/lib1.git master
Даже если изменений не было, он что-то найдет и сделает коммит слияния. Затем, после внесения некоторых изменений в другом месте, конфликт не произойдет во второй раз, когда я вытащу из центрального репо. Но если я забуду запустить pull сразу после нажатия, то следующий pull вызовет этот конфликт.
Итак, теперь мой вопрос: почему это работает? Есть ли ошибка в том, как git-subtree отслеживает push-уведомления, или я что-то упустил?