Фатальная ошибка поддерева git: отказ от слияния несвязанных историй

Я пытаюсь понять, как работает «поддерево git». Я следовал всем указаниям на этой странице, но я всегда получаю сообщение об ошибке при попытке объединить проект поддерева в моем собственном репо («Шаг 2»): fatal: refusing to merge unrelated histories.

Я прочитал этот пост, и когда я использую параметр --allow-unrelated-histories, он кажется, работает нормально. Однако я не уверен, следует ли мне использовать это... У меня сложилось впечатление, что весь смысл поддеревьев состоит в том, чтобы иметь несвязанные истории в одном репозитории, поэтому добавление этой опции кажется странным. Должен ли я добавить его все же, или я делаю что-то не так?

Я использую git v2.9.3 на osx 10.11.6.


person Matthijs    schedule 01.09.2016    source источник
comment
Как говорится в этом сообщении, сама ошибка является новой в Git версии 2.9. Старые версии Git объединяли несвязанные истории без жалоб (и без какой-либо разумной базы слияния, хотя это нормально для несвязанных поддеревьев). Сценарии поддерева основаны на старом поведении.   -  person torek    schedule 02.09.2016
comment
Мне кажется, что --allow-unrelated-histories является параметром git merge, а не git subtree, потому что он находится не в git-subtree(1), а в git-merge(1).   -  person das_j    schedule 28.10.2016
comment
У меня такая же проблема. --allow-unrelated-histories мне тоже кажется неправильным, но, думаю, придется.   -  person beane    schedule 03.03.2018


Ответы (5)


Это была ошибка в git, она была исправлена ​​в https://github.com/git/git/commit/0f12c7d4d175bb0566208213b1b340b6794f305c

См. также: https://www.spinics.net/lists/git/msg282340.html

person daurnimator    schedule 10.02.2017
comment
В какую версию git это наконец попало? - person joeybladb; 02.08.2017
comment
Этот конкретный коммит попал в git v2.9.3, и AFAICT не является решением проблемы OP. Это влияет на поведение --rejoin, которое применяется только к команде subtree split. - person ZachB; 07.11.2018

Если поддерево было добавлено с помощью --squash, вам также нужно использовать --squash при извлечении

git subtree pull --prefix=<folder-goes-here> <remote-goes-here> <branch-goes-here> --squash

person PencilBow    schedule 28.08.2018
comment
Спасибо! Это была моя проблема, так как я, по-видимому, скопировал папку из другого проекта. - person Cameron; 06.05.2019

Я боролся с этим некоторое время и думаю, что нашел решение.

Я новичок в git, так что простите меня, если я использую неправильные имена для вещей.

Проблема могла возникнуть из-за того, что вы использовали параметр --squash при запуске команды добавления поддерева git.

Попробуйте удалить поддерево (удалить удаленный репозиторий и удалить все локальные файлы, зафиксировать и отправить). Затем повторите добавление поддерева без опции --squash.

Затем я перешел к своему репозиторию поддерева, внес некоторые изменения, зафиксировал и отправил их, а затем вернулся к своему основному репозиторию суперпроекта и сделал извлечение поддерева git. Это дало мне некоторую ошибку о модификации рабочего дерева. Чтобы обойти это, я сделал git checkout master, затем git push, затем снова попытался извлечь поддерево. Это сработало.

Надеюсь, это поможет.

person Cyrus    schedule 09.03.2018
comment
Сквош — полезная опция при извлечении большого репо. Можно избежать удаления поддерева и добавления его обратно без поддерева, используя решение @PencilBow. - person Benoit Duffez; 02.01.2019

Что сработало для меня, так это использование git merge со стратегией поддерева:

git merge -s subtree -Xsubtree="$prefix" subremote/branch --allow-unrelated-histories

git subtree использует что-то похожее на это под капотом.

person leoschet    schedule 09.03.2021

Я не эксперт.

Но я нашел кое-что. Я изначально пробовал просто обычную тягу. Но я нашел это конкретное поддерево.

git subtree pull --prefix myPrefixname https://github.com/subTreeRepo.git master --squash

где master - это имя ветки, конечно

(из

https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree/

)

person granadaCoder    schedule 08.03.2019