2012-03-19 12 views
15

Próbowaliśmy uzyskać git-subtree pracując nad projektem (z wersją git 1.7.9.4) i natrafiliśmy na odrobinę komplikacji. Ktoś inny poprzedni dodany poddrzewa z tym poleceniem kilka miesięcy temu:git-subtree pociągają komplikacje

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

Teraz nie było istotnych zmian do foo i chcielibyśmy połączyć w tych zmianach, idealnie zgniatając je Żaden z plików nie zostały. zmodyfikowane, ponieważ zostały zaimportowane.

Próbowałem trzy rzeczy, aby spróbować scalić zmiany.

pierwsze:

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

Która rzuca wyjątek: Can't squash-merge: 'foo' was never added.

drugie:

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

Działa to (w pewnym sensie), ale ma problem ciągnięcie we wszystkich zatwierdzeń i powoduje konflikty z plikami, które zostały zmodyfikowane.

Wreszcie, próbowałem to:

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

To daje mi pożądanego rezultatu, z wyjściem Automatic merge went well; stopped before committing as requested i wszystkie pliki wyświetlane jako zmodyfikowane (przy prawidłowej zawartości).

Idealnie chciałbym kontynuować używanie pierwszej wersji git-subtree i uzyskać wynik zbliżony do ostatniej wersji. Jeśli będziemy musieli używać ostatniej wersji konsekwentnie do przodu, to będziemy, ale jestem nieco zdezorientowany, dlaczego ostatni nie powoduje konfliktów łączących, podczas gdy środkowy.

Każda pomoc jest doceniana.

Odpowiedz

6

Miałem ten sam problem, aw moim przypadku wydaje się, że jest to spowodowane wstępnym zatwierdzeniem poddrzewa, które zostało zgniecione przez połączenie z główną gałęzią.

Patrząc przez źródła poddrzewa Znalazłem to: https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L224

Wygląda poddrzewie greps swój dziennik git dla git-subtree-dir: foo ale nie znalezienia odpowiedniego zatwierdzenia. Wypróbuj git log --grep="git-subtree-dir: foo/*\$", a jeśli jest coś dziwnego w tym zatwierdzeniu, na przykład w związku z zatwierdzeniem scalenia, może to być problem.

Po prostu ciągnięcie bez zgniatania zadziałało dla mnie, oprócz irytujących konfliktów połączeniowych. Zrobiłem to w tymczasowym oddziale, który następnie przekształciłem w inny oddział, aby uniknąć bardziej mylącej historii. Oczywiście można go było także ponownie utworzyć.

+1

Miałem ten sam problem, który okazał się być spowodowany przez brakujący podfolderu w opcji prefiksu podczas próby pobrania. Dodanie tego jako komentarza, ponieważ komunikat o błędzie nie podaje żadnego wskazania tego błędu, a rozwiązywanie problemów doprowadziło mnie tutaj. –

+0

Dzięki, jest to przydatne. Miałem powiązany problem, w którym przeniosłem podkatalog po dodaniu do niego poddrzewa, co wydaje się potknąć w tym meczu –

1

Wystąpił ten sam błąd Can't squash-merge: 'foo' was never added. z sourcetree 1.7.0, gdy robię pull na poddrzewie. Uważam jednak, że moja sprawa jest inna, ponieważ używam podkatalogów.

SourceTree robi coś w następujący sposób:
git -c diff.mnemonicprefix=false -c core.quotepath=false subtree pull -P dir1\subdir1 --squash remote-repo master

i oczywiście, gdybyśmy spróbować ponownie w Git Bash (GIT Wersja 2.6.1.windows.1), będzie to:
git subtree pull -P "dir1\subdir1" --squash remote-repo master

Jednak to się nie udało. Dodaje również nie chociaż składnia polecenia jest w porządku:
git subtree pull -P dir1/subdir1 --squash remote-repo master

Rozwiązanie znalazłem, aby to działało jest użycie Git Bash pomocą następującego polecenia:
git subtree pull -P "dir1/subdir" --squash remote-repo master

myślę, że nie jest jeszcze pewne do zrobienia dla silnika przetwarzania wiersza polecenia Git.

Powiązane problemy