2013-04-21 5 views
12

Ich verwende in meinem Projekt, das aus mehreren Teilprojekten besteht. Jedes Unterprojekt wird im Hauptprojekt mit dem Befehl "verknüpft". Das ist meine Art, "svn externals" in zu realisieren. Ich benutze es seit einigen Wochen, aber die Zeit, in der ich meine Änderungen vom Unterbaum zum entfernten Standort übertrage, steigt mit jedem Commit. Es sieht so aus, wenn ich die Änderungen Drücken des BefehlsVerringern Sie die Zeit für das Verschieben eines Teilbaums

git subtree push -P platform/rtos rtos master 

git push using: rtos master 

1/ 215 (0)2/ 215 (1)3/ 215 (2)4/ 215 (3)5/ 215 (4)6/ 215 (5)7/ 215 (6)8/ 215 (7)9/ 215 (8)10/ 215 (9)11/ 215 (9)12/ 215 (10)13/ 215 (11)14/  
.... 

20 more lines 

.... 

(204)209/ 215 (205)210/ 215 (206)211/ 215 (207)212/ 215 (208)213/ 215 (209)214/ 215 (210)215/ 215 (211)To https://github.com/rtos/rtos.git 
    64546f..9454ce 9a9d34c5656655656565676768887899898767667348590 -> master 

Gibt es eine Möglichkeit den Teilbaum zu „säubern“ und damit die Zeit zu reduzieren, die Änderungen drängen?

+3

Submodule funktionieren nicht für alle, die Frage betrifft Subbäume. –

Antwort

1

Beachten Sie, dass, wenn Sie git submodule wechseln möchten, können Sie jetzt, since git1.8.2 (2013.03.08) die neuesten Commits eines Submoduls Repo verfolgen.

Siehe git externals.

"git Submodul" begann einen neuen Modus zu lernen, um mit der Spitze der Remote-Zweig zu integrieren (im Gegensatz zu der Integration mit dem Commit im Superprojekt gitlink aufgezeichnet).

Das schnellere Push machen könnte, während sie von den zusätzlichen Informationen profitieren Submodul über hat einen Teilbaum (dh eine leichte Aufzeichnung eines bestimmten der Submodul Festschreibung)

Sie dieses Modul in die aktualisieren neueste eines bestimmten Zweig mit:

git submodule update --remote 

Diese Option ist für den update Befehl nur gültig.
Verwenden Sie den Status des Remote-Tracking-Zweigs des Submoduls, anstatt das Superprojekt SHA-1 zu verwenden, um das Submodul zu aktualisieren.

+3

Schöne Alternative, aber diese Frage ist über Teilbäume. Wäre toll zu finden eine Antwort. –

5

Nein, leider nicht. Wenn Sie git subtree push ausführen, werden alle Commits für diesen Teilbaum neu erstellt. Es muss das tun, da ihre SHA von der vorherigen Verpflichtung abhängt und diese SHAs benötigt, um die neuen Commits mit den alten zu verknüpfen. Es könnte das cachen, tut es aber nicht.

Ich denke, das ist der Preis, den Sie für die Verwendung von Teilbaum im Vergleich zu Submodulen bezahlen. Subtree ist in Ihrem Repository sehr zustandslos, was auf der Hand liegt, aber diese lange Berechnung verursacht. Submodule speichern alle ihre Informationen, die Sie verwalten müssen, macht aber auch solche Sachen viel schneller.

+3

Es ist überraschend 'git subtree' kann (nicht?) Nur diese Informationen zwischenspeichern, so dass nach dem ersten' git subtree push' alles relativ bissig wird. – davidg

+0

@davidg Es könnte sicherlich. – Chronial

+1

Besonders unter Windows ist das lächerlich langsam. In meinem Fall, wenn Sie die 600 Assertion Count erreichen, dauert es über eine Minute für jeden Push, der den Git zu diesem Zeitpunkt nutzlos macht. –

11

Versuchen Sie, das --rejoin-Flag zu verwenden, damit der Teilbaum nach der Aufteilung wieder korrekt mit Ihrem Haupt-Repository zusammengeführt wird. Auf diese Weise muss jede Spaltung nicht durch die gesamte Geschichte gehen.

git subtree split --rejoin --prefix=<prefix> <commit...> 

Vom original subtree documentation:

Nach der Spaltung verschmelzen die neu erstellte synthetische Geschichte zurück in Ihr Hauptprojekt. Auf diese Weise können zukünftige Splits nur den Teil des Verlaufs durchsuchen, der seit dem letzten --rejoin hinzugefügt wurde.

+2

Und verwenden Sie die ? Ich versuchte es mit der Spitze dieses Teilbaums und obwohl es das Split/Rejoin (nicht einmal sicher, was das bedeutet), meine nächste Unterbaum Push war genauso lang :( –

0

Vielleicht hilft: Ich glaube, Sie git subtree split nur gehen zurück n verpflichtet, indem Sie

git subtree split --prefix XXX HEAD~n.. 

oder durch Angabe der Sie mit zum Beispiel beginnen soll commit sagen kann

git subtree split --prefix XXX 0a8f4f0^.. 

Dies hilft, die Zeit zu reduzieren, obwohl es unbequem ist.

Verwandte Themen