Git-поддерево тянуть осложнения - PullRequest
18 голосов
/ 20 марта 2012

Мы пытались заставить git-subtree работать над проектом (с версией git 1.7.9.4) и столкнулись с некоторыми сложностями. Кто-то еще ранее добавил поддерево этой командой несколько месяцев назад:

git subtree add --prefix=foo git@example.com:foo.git master

Теперь в foo произошли существенные изменения, и мы хотели бы объединить эти изменения, в идеале их объединяя. Ни один из файлов не был изменен с момента их импорта.

Я попробовал три вещи, чтобы попытаться объединить изменения.

Во-первых:

git subtree pull --squash -P foo git@example.com:foo.git master

Что выдает исключение: Can't squash-merge: 'foo' was never added.

Второе:

git subtree pull -P foo git@example.com:foo.git master

Это работает (вроде), но имеет проблему с извлечением всех коммитов и конфликтует с файлами, которые были изменены.

Наконец, я попробовал это:

git pull --squash -s subtree git@example.com:foo.git  master

Это дает мне желаемый результат с выводом Automatic merge went well; stopped before committing as requested и всеми файлами, которые отображаются как измененные (с правильным содержимым).

В идеале я хотел бы продолжить использовать первую git-subtree версию и получить вывод, близкий к последней версии. Если мы будем последовательно использовать последнюю версию, мы будем использовать ее, но меня немного смущает вопрос, почему последняя не вызывает конфликтов слияния, а средняя -

Любая помощь приветствуется.

Ответы [ 2 ]

9 голосов
/ 22 мая 2012

У меня была такая же проблема, и в моем случае, похоже, это связано с тем, что начальная фиксация поддерева была объединена с веткой master в ветке master.

Просматривая источник поддерева, я обнаружила следующее: https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L224

Похоже, что поддерево обрабатывает ваш git log для git-subtree-dir: foo, но не находит подходящий коммит.Попробуйте git log --grep="git-subtree-dir: foo/*\$", и если что-то странное с этим коммитом, например, это коммит слияния, это может быть проблемой.

Мне просто работало вытягивание без сдавливания, кроме раздражающих конфликтов слияния.Я сделал это во временной ветке, которую я затем перевел в другую ветку, чтобы избежать более сложной истории.Конечно, вместо этого его тоже можно было перебазировать.

2 голосов
/ 22 апреля 2016

Я сталкиваюсь с той же ошибкой Can't squash-merge: 'foo' was never added. с исходным деревом 1.7.0 всякий раз, когда я выполняю извлечение поддерева.Тем не менее, я считаю, что мой случай другой, потому что я использую подкаталоги.

Sourcetree делает что-то следующее:
git -c diff.mnemonicprefix=false -c core.quotepath=false subtree pull -P dir1\subdir1 --squash remote-repo master

И, очевидно, если бы мы попробовали это снова вGit Bash (Git версии 2.6.1.windows.1) это будет:
git subtree pull -P "dir1\subdir1" --squash remote-repo master

Однако это не удалось.Следующее также не удалось, хотя синтаксис команды в порядке:
git subtree pull -P dir1/subdir1 --squash remote-repo master

Решение, которое я нашел, чтобы заставить его работать, состоит в том, чтобы использовать Git Bash со следующей командой:
git subtree pull -P "dir1/subdir" --squash remote-repo master

Полагаю, что для обработчика командной строки Git еще предстоит проделать определенную работу.

...