2012-03-19 4 views
15

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

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 и получить выход, близкий к последней версии. Если мы будем последовательно использовать последнюю версию, мы будем, но я немного смущен, почему последний не создает конфликтов слияния, пока средний делает.

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

ответ

6

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

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

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

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

+1

У меня была такая же проблема, которая, как оказалось, была вызвана отсутствием подпапки в префиксной опции при попытке вытащить. Добавление этого в качестве комментария, поскольку сообщение об ошибке не дает никаких указаний на эту ошибку, и устранение неполадок привело меня сюда. –

+0

Спасибо, это полезно. У меня была связанная с этим проблема, когда я переместил subdir после добавления в нее поддерева, который, кажется, отключает этот матч –

1

Я испытывал ту же ошибку 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 версия 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 для командной строки.