2012-10-09 14 views
8

Używam git-subtree (od Avery Pennarun). W moim bieżącym repozytorium git mam oczywiście wszystkie moje pliki/foldery projektu i podtekst o nazwie "lib". Jeśli teraz sklonuję to repozytorium git za pomocą git clone, otrzymam wszystkie pliki projektu i podtree "lib" (wszystko, jak powinno być). Co próbowałem teraz: Zmieniłem coś w podtekście "lib" w sklonowanym repozytorium i próbowałem przesunąć zmiany z powrotem na zdalne repo subtree "lib" używając git subtree push, ale to nie zadziałało. Jaki jest problem? Czy muszę go najpierw dodać jako subtree z dodaniem git subtree?git-subtree: Wciśnij zmiany ze sklonowanego repo

Thx z góry

+0

Jak dodać poddrzewo do projektu najwyższego poziomu? Zrobiłeś tylko katalog i sklonowałeś go? –

+0

Cześć! Dodałem poddrzewo do mojego projektu na najwyższym poziomie, używając "git subtree add". Może moje pytanie nie jest wystarczająco jasne: jeśli sklonuję repo na innej maszynie, mam wszystkie pliki projektów plus poddrzewo "lib". Teraz zmienię coś w obrębie podtekstu "lib" w klonowanym repo, nie mogę przekazać zmian z powrotem do zdalnego serwera za pomocą "git subtree push", to jest mój problem. – arge

+0

Czy odpowiedź była pomocna? –

Odpowiedz

14

Zastrzeżone, podejrzewam, jestem tylko kilka dni przed wami learing o poddrzewie :-)

Jeśli tylko przy użyciu git subtree push nie jesteś podając poddrzewa wystarczająco dużo informacji, aby wyodrębnić i popchnij swoje zmiany.

Jeśli prawidłowo sklonowałeś repo, podtekst będzie już tam. Subtree musi zostać poinformowane, z którego subtree chcesz przejść (nawet jeśli masz tylko jedną), a także musi wiedzieć, do czego się popchnąć - w szczególności, nie chcesz naciskać na repo najwyższego poziomu. Stąd, chcesz coś takiego:

git subtree push --prefix=lib [email protected]:arges-github/lib.git master 

Oczywiście repo i refspec powinny być zmienione, aby dopasować swoje repo.

Jeśli chcesz spojrzeć na to, co dzieje się tutaj (i to nie pomaga) subtree faktycznie dzieli zmiany, które wpływają na pliki wewnątrz poddrzewa do innego oddziału, a następnie wypycha że do repo poddrzewa. Aby tak się stało, należy subtree split

git subtree split --rejoin --branch=shared-changes --prefix=lib 

następnie przyjrzeć się branży już wykonane:

git checkout lib-changes 

i wcisnąć je ręcznie

git push [email protected]:arges-github/lib.git master 

Jeśli tak nie jest działa to może być, że nie połączyłeś poddrzewa z repo. Gdy dodasz poddrzewo:

git subtree add --squash --prefix lib [email protected]:arges-github/lib.git master 

musisz również scalić poddrzewo i przywrócić je do repozytorium najwyższego poziomu.

git subtree pull --squash --prefix lib [email protected]:arges-github/lib.git master 
git push 
+0

Wykonałem te czynności aż do "dodania". Nie znaleziono żadnej dokumentacji sugerującej, że wymagane jest kolejne "pociągnięcie". Co by się stało, gdyby początkowe "ciągnięcie" nie zostało wykonane w poddrzewie po "dodaniu"? Problem, z którym się borykam, polega na tym, że nawet po "dodaniu" do --squash, kiedy próbuję "poddać podtekstowi", zaczyna od nowa sprawdzać wszystkie zatwierdzenia w tym podteście, chociaż chcę, żeby naciskał tylko te zatwierdzenia. które są po dodaniu "poddrzewa" do repozytorium kontenera. – Nishith

1

Miałem dokładnie ten sam problem, który miałeś, i rozwiązałem go w zasadzie zgodnie z sugestią Rogera Nolana. Jeśli jednak masz pecha, aby znaleźć się w systemie plików niewrażliwym na wielkość liter, tak jak ja, musisz także upewnić się, że za każdym razem, gdy wykonujesz pull i push, wielkość twojego prefiksu pozostaje taka sama.

Kiedy skończysz pomyłkę przez pomyłkę, git pomyśli, że masz dwa poddrzewa, podczas gdy tylko jeden będzie istnieć w systemie plików.

więc rozwiązanie, które skończyło się (w przypadku pomaga nikomu) to:

  1. utworzyć skrypt, który będzie Push poddrzewa. Nazywają to publish_<your-subtree-name>.
  2. Utwórz kolejny skrypt, który spowoduje pobranie twojego poddrzewa. Nazywają to update_<your-subtree-name>.
  3. Utwórz tymczasowy oddział przy aktualizacji HEAD i przetestuj. Jeśli twój skrypt ma rację, twój oddział temp nie będzie się ruszał.
  4. Sklonuj subtree repo gdzie indziej, dodaj testowe zatwierdzenie, wciśnij i spróbuj wciągnąć do repozytorium, używając właśnie napisanego skryptu aktualizacji.
  5. Jeśli to wszystko działa, usuń swój tymczasowy oddział, a teraz sprawdź oba skrypty, aby uzyskać repozytorium super projektu.
  6. Następnie za każdym razem, gdy musisz naciskać lub wyciągać poddrzewa, użyj skryptów.

PS> Parametr --squash jest ważny, szczególnie jeśli różne gałęzie twoich reporsitories ciągną różne gałęzie poddrzewa, a także jeśli masz wiele poddrzew w swoim projekcie.

Powiązane problemy