2281 Stimmen

Wie führt man zwei Git-Repositories zusammen?

Stellen Sie sich das folgende Szenario vor:

Ich habe ein kleines experimentelles Projekt A in einem eigenen Git Repo entwickelt. Jetzt ist es ausgereift, und ich möchte, dass A Teil des größeren Projekts B ist, das sein eigenes großes Repository hat. Ich möchte nun A als Unterverzeichnis von B hinzufügen.

Wie kann ich A mit B verschmelzen, ohne dass die Geschichte auf irgendeiner Seite verloren geht?

17 Stimmen

Wenn Sie nur versuchen, zwei Repositories zu einem einzigen zusammenzufassen, ohne beide Repositories behalten zu müssen, werfen Sie einen Blick auf diese Frage: stackoverflow.com/questions/13040958/

0 Stimmen

Für das Zusammenführen von Git Repo in einem benutzerdefinierten Verzeichnis mit Speicherung aller Comits verwenden Sie stackoverflow.com/a/43340714/1772410

5voto

Turadg Punkte 7202

Ähnlich wie @Smar, verwendet aber Dateisystempfade, die in PRIMARY und SECONDARY festgelegt werden:

PRIMARY=~/Code/project1
SECONDARY=~/Code/project2
cd $PRIMARY
git remote add test $SECONDARY && git fetch test
git merge test/master

Dann führen Sie sie manuell zusammen.

(angepasst von Beitrag von Anar Manafov )

4voto

Dzintars Punkte 1082

Es gibt ein Copybara-Tool, das von Google für komplexere Anwendungsfälle verwendet wird - https://github.com/google/copybara

4voto

Andreas Reiff Punkte 7205

https://github.com/hraban/tomono als weiterer Hinweis auf eine skriptbasierte Lösung.

Ich bin nicht der Autor, aber ich habe es benutzt und es erfüllt seine Aufgabe.

Ein positiver Aspekt ist, dass Sie alle Zweige und die gesamte Historie in das endgültige Repo bekommen. Bei meinen Repos (keine doppelten Ordner in den Repos - sie stammen eigentlich aus der tfs2git-Migration) gab es keine Konflikte und alles lief automatisch.

Es wird hauptsächlich (siehe Name) zur Erstellung von Monorepos verwendet.

Für Windows-Benutzer: git bash kann die .sh-Datei ausführen. Sie ist in der Standardinstallation von Git enthalten.

4voto

Ein A in B zusammenführen:

1) Bei dem Projekt A

git fast-export --all --date-order > /tmp/ProjectAExport

2) Bei dem Projekt B

git checkout -b projectA
git fast-import --force < /tmp/ProjectAExport

Führen Sie in diesem Zweig alle erforderlichen Operationen durch und übertragen Sie sie.

C) Dann zurück zum Master und eine klassische Zusammenführung zwischen den beiden Zweigen:

git checkout master
git merge projectA

4voto

koppor Punkte 16743

Wenn Sie drei oder mehr Projekte in einem Paket zusammenführen möchten simple übertragen, führen Sie die Schritte aus, die in den anderen Antworten beschrieben sind ( remote add -f , merge ). Setzen Sie dann den Index (sanft) auf den alten Kopf zurück (wo keine Zusammenführung stattfand). Fügen Sie alle Dateien ( git add -A ) und übertragen Sie sie (Meldung "Zusammenführung der Projekte A, B, C und D zu einem Projekt). Dies ist nun die Commit-id von master.

Erstellen Sie nun .git/info/grafts mit folgendem Inhalt:

<commit-id of master> <list of commit ids of all parents>

Laufen lassen git filter-branch -- head^..head head^2..head head^3..head . Wenn Sie mehr als drei Zweige haben, fügen Sie einfach so viel head^n..head wie Sie Zweige haben. Um Tags zu aktualisieren, fügen Sie --tag-name-filter cat . Fügen Sie dies nicht immer hinzu, da dies zu einem Neuschreiben einiger Übertragungen führen kann. Für Details siehe Manpage von filter-branch suchen Sie nach "Transplantate".

Ihre letzte Übergabe hat nun die richtigen Eltern zugeordnet.

1 Stimmen

Moment, warum wollen Sie drei Projekte in einer einzigen Übertragung zusammenführen?

0 Stimmen

Ich begann mit Repository, Repository-Client und Modeler als separate Git-Projekte. Das war für die Mitarbeiter schwierig, also habe ich sie in einem einzigen Git-Projekt zusammengefasst. Um zu wissen, dass die "Wurzel" des neuen Projekts aus drei anderen Projekten stammt, wollte ich Folgendes haben einzeln merge commit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X