2010-10-15 6 views
16

Ich habe die Aufgabe, Perforce meines Team & Quelle von git der Migration auf Perforce, und ich bin auf der Suche nach Ideen, wie die git Geschichte in p4 zu bewegen.von git Migration

Ich würde glücklich sein, Meister Zweig nur zu bewegen. Aber auch das erweist sich als problematisch.

Ich benutze das wunderbare git-p4-Tool. Ich erstelle einen Zielbereich in meinem p4-Arbeitsbereich und benutze git p4 clone //depot/StuffFromGit, um das Tracking in git-p4 zu starten. Ich übertrage alle Änderungen meines git-Repositorys in den git-p4-Klon. Ich kann dann git p4 submit und fertig sein, alle Änderungen werden auf p4 geschoben.

Es funktioniert großartig, wenn die git Geschichte wie folgt aussieht, schön und linear:

A---B---C---D 

Das Problem kommt mit mehreren Personen an dem Projekt arbeiten. Obwohl sie an Master arbeiten, entstehen immer noch Zweige, die sich teilen und zusammenführen. Dennoch git-p4 diese tapfer Griffe:

A---B---C---E 
    \--D--/ 

git p4 quert OK, ABCDE, um zu begehen (oder ABDCE, entweder Person Geschichte zuerst).

Das Problem kommt, wenn zum Beispiel, C und D beide die gleiche Datei zu ändern, und E ist ein Echt ehrlich-zu-Güte verschmelzen. git p4 rebase schlägt hier fehl; Es wird die Commits zurückspulen, aber während der Wiedergabe wird zuerst C angewendet, dann D versucht und ein Konflikt gefunden. Es wird dann aufhören und mich bitten, zu verschmelzen. Nun, E enthält die Zusammenführung, aber es bittet mich, manuell zusammenzuführen! 'git p4 submit' wird auf ähnliche Weise fehlschlagen, nur jetzt wird die Änderung vor dem Zusammenfügen von p4 abgelehnt.

 
Using index info to reconstruct a base tree... 
Falling back to patching base and 3-way merge... 
Auto-merging main.cpp 
CONFLICT (content): Merge conflict in main.cpp 
Failed to merge in the changes. 
Patch failed at 0005 Changing main 

So jetzt bin ich fest. Gibt es eine Möglichkeit, die git-Geschichte zu bereinigen oder git-p4 dazu zu bringen, sie zu verstehen? Es ist frustrierend, da die Zusammenführungen da sind.

Gedanken Ich habe:

  • git filter-branch jegliche Erwähnung von widerstreitenden Dateien zu entfernen. Ich würde die Geschichte Kommentare über, obwohl viele Dateiänderungen fehlen. Mit ungefähr 3000 Commits in der Geschichte würde ich alle Geschichte der Schlüssel- (beschäftigten) Akten entfernen. Am Ende des gefilterten Dateiimports würde ich die fehlenden Dateien hinzufügen, indem ich eine endgültige Übergabe des HEADs vornahm.
  • Dump die Geschichte, machen Sie eine einzelne P4 Commit des HEAD (einfach, aber traurig).
  • Nicht zu p4: Ich habe diese Idee so lange wie möglich bearbeitet.

Keiner von denen sind wirklich toll. Irgendwelche Ideen, wie 'gt p4 rebase' oder 'git p4 send' funktionieren soll?

+14

Angesichts der Geschichte des Git, ist das ein bisschen eine lustige Richtung zu migrieren. –

+2

Klingt wie git-p4 versucht, C, D ** und ** E zu verschmelzen und natürlich kläglich scheitern. Hast du überprüft, dass du das neueste git-p4 verwendest und ob es Patches gibt oder andere Leute das gleiche Problem gesehen haben? –

+16

Wow, Mann, tut mir leid. Klingt, als würdest du dich 10-15 Jahre rückwärts bewegen. – Jonathan

Antwort

6

Die Option "die alte Geschichte einfach wegzuwerfen" ist nicht so schlimm, wie es klingt: Sie können Ihren Git Repo einfach für immer bei sich behalten, für den Fall, dass jemand durch die alten Sachen graben muss. Leider gibt es einfach keine Möglichkeit, gits komplexe Sicht der Geschichte in linearen Systemen wie svn und p4 im alten Stil darzustellen.

Der Hauptgrund, zurück in die alte Geschichte zu schauen, ist für Dinge wie 'Git Annotate' (ich nehme an, dass p4 ein ähnliches Werkzeug hat).Wenn das alles ist, was Sie wollen, dann ist es vielleicht das, was Sie wirklich tun wollen, indem Sie alle Ihre Merge-Commits auf nur einen ihrer Eltern reduzieren (so sehen sie wie ein einzelner Commit statt einer Zusammenführung aus). Das ist mehr wie das, was svn und p4 in ihrem eigenen Historienmodell aufgezeichnet hätten, wo Merges nur wie ein einzelnes Commit im linearen Stream aussehen. Sie können dies wahrscheinlich mit git-filter-branch oder dergleichen tun. Natürlich würde dies die gesamte Geschichte, die in Unterzweigen passiert ist, verlieren ... aber p4-Benutzer sind es gewohnt, diese Informationen nicht zu haben.

+0

Perforce verwendet in der Regel nicht sub -branches, aber es kann, wenn Sie die Zweige verwalten möchten. Dann sind die Informationen da. –

-2

Ich denke, Sie sollten versuchen, mit Tortoise SVN und dann Hg unter Berücksichtigung der einzelnen Zweig-Update oder Sie können sagen, Migration. Stellen Sie sicher, dass Sie alle Dumps geklont haben, um auf der sicheren Seite zu sein. Viel Glück!

2

Haben Sie das Werkzeug "Schneider" ausgecheckt? Es ist gebaut um verschiedene VCS zu synchronisieren: es. Es sollte Perforce-Unterstützung haben.

Als Nebenbemerkung wäre meine erste Reaktion, die Entscheidung ernsthaft in Frage zu stellen, aber ich nehme an, Sie haben das schon getan.