2012-06-03 13 views
9

Mam kilka repozytoriów git, z których każdy zawiera jeden plik. Chciałbym połączyć je wszystkie razem, najlepiej w jednym kroku. Co mi jest dążenie do tego wykresu:Połączenie ośmiornicy Git z niepowiązanymi repozytoriami

*----¬ mergedrepo/master 
| \ \ \ 
| | | * repoA/master 
| | * repoB/master 
| | | 
| | * repoB/... 
| * repoC/master 
* repoD/master 
| 
* repoD/... 

Próbowałem git merge, ale wydaje się, że strategia ośmiornicy nie działa dla drzew rozłącznych

$ git merge a/master b/master c/master d/master 
Unable to find common commit with a/master 
Automatic merge failed; fix conflicts and then commit the result. 

powiedziano mi też, że git merge --squash pomogłoby , ale to dało ten sam błąd.

Generuje prawy wykres, ale traci wszystkie pliki:

$ git merge -s ours a/master b/master c/master d/master 

Jak mogę to zabrać?

+0

Twoje połączenie ośmiornicy zadziała, po prostu musisz naprawić konflikty, tak jak mówi komunikat. Po rozwiązaniu konfliktów powinieneś móc po prostu zatwierdzić. –

+2

@CharlesBailey: Nie ma konfliktów! – Eric

+0

Tak, są: "Automatyczne scalanie nie powiodło się, napraw konflikty, a następnie zatwierdz wyniki.". Aby rozwiązać konflikt, prawdopodobnie chcesz dodać wszystkie ścieżki będące w konflikcie, jeśli pliki nie mają takich samych nazw w repozytoriach. –

Odpowiedz

3

Utwórz pusty popełnić

git commit -m "Common commit" --allow-empty 

spojrzeć na jego hash z log -1 i dodać go do przeszczepów plik bez żadnych rodziców

echo HASH_OF_COMMON_COMMIT >> .git/info/grafts 

następnie znaleźć wszystkie inne korzenie z log --max-parents=0 i dla każdego dodatkowego ich skrót do pliku graftowania z powyższym hashem jako rodzica

each HASH_OF_ROOT HASH_OF_COMMON_COMMIT >> .git/info/grafts 

, a teraz połącz!

Plik przeszczepów to sposób na zmianę rodziców zatwierdzenia i kiedy wszystkie repozytorium mają wspólne zatwierdzenie, twoje repozytorium powinno zaakceptować scalenie.

4

Udało mi się rozwiązać problem związany z połączeniem ośmiornicy niepowiązanych gałęzi. Niestety, poniższe przypadki dotyczą tylko prostych sytuacji, w których nie występują rzeczywiste konflikty.

  1. Dokonaj scalenia zgodnie z opisem w PO. "Nie powiedzie się", twierdząc o konfliktach. Ale połączenie zostało wykonane i ten fakt został zarejestrowany, chociaż nie ma zmian w indeksie.
  2. Dodaj zawartość oddziałów do indeksu za pomocą polecenia read-tree:

    git read-tree a/master b/master c/master d/master

    Nie wpłynie to drzewo działa, tylko indeks zostanie zaktualizowany.

    Jeśli gałęzie nie są całkowicie niezależne, dostosuj ich kolejność, pamiętając, że te ostatnie nadpiszeją zawartość poprzednich gałęzi.

  3. Zatwierdź normalnie.
  4. Wykonaj twardy reset (git reset --hard), aby uzyskać spójne drzewo robocze.

Przypuszczam, że można później edytować i poprawiać to zatwierdzenie, ale ja osobiście tego nie próbowałem.

+0

Prawdopodobnie masz na myśli 'git read-tree ...' zamiast 'git read-subtree ...'. Również założę się, że czytelnicy docenią, jeśli podasz przykłady kodu dla każdego kroku, takie jak 'git reset --hard' dla kroku 4. –

+0

Och, rzeczywiście" read-tree ". Dziękuję za wyjaśnienie tego. – Vertigo

+1

W przypadku, gdy ktoś inny ma problem z określeniem tego: podczas gdy nie dodajesz nazwy gałęzi, do której się łączysz, w komendzie 'git merge', powinieneś uwzględnić ją w komendzie' git read-tree'. – dave4420

Powiązane problemy