Verschmelzen Sie zwei Git Repos und behalten Sie den Verlauf

8

Ich möchte noch eine weitere Frage ausweiten: Merge zwei Git-Repositories und behalten Sie den Master-Verlauf

Es ist mir gelungen, zwei verschiedene Repos zu einem Repo zusammenzufassen. Ich brauchte eine Rebase, um dies erfolgreich zu machen. Der Master ist korrekt, aber Ich möchte auch den Merge-Verlauf beibehalten . Ist das möglich?

Ich habe 2 Repositories:

Dies ist das Ergebnis nach der Umbasierung. Die Zeiten des obersten Repo sind die Rebase-Zeit. Das ursprüngliche Datum ist verloren!

So habe ich es gemacht:

%Vor%

Ist es möglich, so etwas zu haben? ( gemalte Lösung !!! )

Ich möchte die ursprüngliche Zeit + die Zusammenführungsgeschichte behalten.

UPDATE - ANTWORT

Die Antwort, die am besten für mich funktioniert hat, war die Arbeit mit den Graft-Punkten. Aber andere Antworten sind auch in anderen Anwendungsfällen sehr brauchbar. Ich habe meine Ergebnisse auf GitHub hinzugefügt, so dass jeder bewerten kann.

Antwort 1: Am besten funktioniert es in meinem Fall Das 'Graft' hat mir die richtige Antwort gegeben.

GitHub: RepoGraft

Antwort 2 Die Option "Ersetzen" von "LeGEC" liefert auch für einige Anwendungsfälle gute Ergebnisse. Eine Anomalie blieb für mich:

GitHub: RepoHistory

Antwort 3: Sinnvoll hinzufügen Die Antwort von 'VonC'. Ich konnte die Option "Preserve-merges working" in meinem Fall nicht erhalten. Dies könnte in anderen Szenarien funktionieren, aber ich habe diesen Treiber nicht getestet.

    
Dimitri Dewaele 17.02.2017, 07:45
quelle

4 Antworten

4

Wie Sie herausgefunden haben, ist rebase nicht der Befehl, den Sie zum Zusammenfügen von Historien verwenden möchten (weil er den Verlauf tatsächlich neu schreibt). Frühe Git hatte ein Feature (Hack) speziell für das, was Sie versuchen zu tun: Graft-Punkte . Noch besser, seit 1.6.5 können Sie git replace --graft stattdessen verwenden:

%Vor%

( git log RepoA/master --format=%H | tail -1 gibt das initiale Commit von RepoA zurück)

Technisch könnten Sie den ersten replace überspringen, wenn Sie noch nichts Wertvolles in master haben, was nur einen Verlauf mit RepoB + RepoA ergibt.

Diese Befehle erstellen Einträge in refs/replace/* , die verschoben und verschoben werden können, um Ihren überarbeiteten Verlauf mit anderen zu teilen. Oder, wenn Sie nicht daran interessiert sind, die SHAs von RepoA / RepoB zu erhalten, können Sie die Ersetzungen permanent machen, indem Sie git filter-branch --all ausführen, um eine "echte" Menge von Commits der gewünschten Herkunft zu erzeugen / p>     

dahlbyk 25.02.2017, 14:36
quelle
1

Es gibt zwei Optionen in git rebase, die in Ihrem Fall von Interesse sein könnten:

%Vor%
  

Erstellen Sie Merge-Commits neu, anstatt den Verlauf durch Wiederholen von Commits, die ein Merge-Commit einführt, zu reduzieren.

%Vor%

(aus git am )

  

Standardmäßig zeichnet der Befehl das Datum aus der E-Mail-Nachricht als das Autorisierungsdatum des Commits auf und verwendet den Zeitpunkt der Erstellung des Commits als Committer-Datum. Dadurch kann der Benutzer über das Committer-Datum lügen, indem er denselben Wert wie das Autorendatum verwendet.

Testen Sie, ob die zweite Rebase mit:

kein besseres Ergebnis liefert %Vor%     
VonC 21.02.2017 19:12
quelle
1

Diese Antwort schlägt eine andere Möglichkeit vor, RepoB als aktiven Repo zu verwenden und trotzdem Zugriff auf RepoA history:

zu haben

verwende git replace

%Vor%

Hinweis: Diese Operation wird auf Ihrem Computer ausgeführt, nicht auf den Remote-Repositories. Sie sollte daher bei allen neuen Clones wiederholt werden.

Variante :

Sie können RepoA:master auf RepoB unter einem neuen Namen (z. B. RepoB:history/master ) setzen, dann können Sie git replace abcdef history/master für Commits verwenden, die alle in RepoB gespeichert sind.

    
LeGEC 22.02.2017 09:21
quelle
1

Versuchen Sie, die folgenden Schritte auszuführen:

  1. Erstellen Sie ein neues leeres Repository New.

  2. Machen Sie eine initiale Festschreibung, weil wir eine benötigen, bevor wir eine Zusammenführung durchführen.

  3. Fügen Sie eine Fernbedienung zum alten Repository OldA hinzu.

  4. Verknüpfen Sie OldA / master mit New / master.

  5. Erstellen Sie ein Unterverzeichnis OldA.

  6. Verschieben Sie alle Dateien in das Unterverzeichnis OldA.
  7. Übernehmen Sie alle Dateibewegungen.
  8. Wiederholen Sie 3-6 für OldB.

Ein Powershell-Skript für diese Schritte könnte folgendermaßen aussehen:

Nehmen Sie an, dass das aktuelle Verzeichnis das Verzeichnis ist, in dem das neue Repository erstellt werden soll Erstellen Sie das neue Repository

$ git init

Bevor wir eine Zusammenführung durchführen, müssen wir eine initiale Festschreibung haben, also machen wir eine Dummy-Festschreibung

$ dir & gt; delete.txt $ git add.

$ git commit -m "Erstes Dummy-Commit"

Fügen Sie eine Fernbedienung für das alte Repo hinzu und rufen Sie es ab

$ git remote add -f alt_a

Fügen Sie die Dateien von old_a / master in new / master

ein

$ git merge old_a / master

Bereinigen Sie unsere Dummy-Datei, weil wir sie nicht mehr brauchen

$ git rm. \ delete.txt

$ git commit -m "Initialdatei bereinigen"

Verschieben Sie die old_a-Repo-Dateien und -Ordner in ein Unterverzeichnis, damit sie nicht mit dem anderen später eintreffenden Repo kollidieren

$ mkdir old_a

$ dir -exclude old_a | % {git mv $ _. Name alt_a}

Übernehmen Sie den Umzug

$ git commit -m "Verschiebe alte Dateien in das Unterverzeichnis"

Machen Sie dasselbe für old_b

$ git remote add -f alt_b

$ git merge old_b / master

$ mkdir old_b

$ dir -exclude alt_a, alt_b | % {git mv $ _. Name alt_b}

$ git commit -m "Verschiebe old_b-Dateien in das Unterverzeichnis"

Bringe einen Feature-Zweig von einem der alten Repos mit $ git checkout -b Funktion läuft

$ git merge -s rekursiv -Xsubtree = alt_a alt_a / feature-in-progress

Ich hoffe, es hilft.

    
BhanuSingh 24.02.2017 07:17
quelle

Tags und Links