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