Git -выходные осложнения

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

git subtree add --prefix=foo [email protected]:foo.git master

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

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

Во-первых:

git subtree pull --squash -P foo [email protected]:foo.git master

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

Во-вторых:

git subtree pull -P foo [email protected]:foo.git master

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

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

git pull --squash -s subtree [email protected]:foo.git  master

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

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

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

Ответ 1

У меня была та же проблема, и в моем случае это, по-видимому, связано с тем, что начальное поддерево, которое сжимается в главной ветки, сжимается.

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

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

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

Ответ 2

Я испытывал ту же ошибку Can't squash-merge: 'foo' was never added. с sourcetree 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 version 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.