2009-09-11 8 views
26

Derzeit, wenn ich git svn dcommit git ausführen erstellt eine separate Commit in SVN für jede lokale Commit, die ich seit der letzten Synchronisierung mit SVN gemacht habe. Gibt es einen Weg für dcommit stattdessen alle meine letzten lokalen Commits in einem Commit für SVN zu kombinieren?Kombiniere lokale Git-Commits in einen Commit für git-svn

Antwort

18
git rebase remotes/trunk --interactive 

sollten Sie in das Menü bringen, wo Sie Commits oder quetschen sie alle in 1 verpflichten, um Ihre SVN-Repository zu vermeiden holen können verschmutzen. This ist eine wirklich gute (aber kurze) Ressource für die Arbeit mit Git-Svn.

+0

Dies scheint wie eine sehr gute Lösung. Ich verstehe nicht, was der Effekt von Fernbedienungen/Trunk im Befehl ist, das Endergebnis ist, dass alle meine Commits innerhalb des Masters zerquetscht werden. Ich hatte gehofft, sie würden nur beim Senden an SVN gequetscht werden. Nach dem Quetschen ist es notwendig, sich an SVN zu binden. –

+0

@MacRae Linton: Alle deine Commits müssen im Master gequetscht werden. Wenn sie nicht git wären, gäbe es keine Möglichkeit, die git und svn Repositories synchron zu halten. Wenn du die letzten Änderungen neu erstellst, würde svn einen commit haben, aber in git hättest du n commits. –

+0

@Jason Punyon: Das Problem, auf das ich stoße, ist, dass es nach dem Quetschen von Commits im Master schwierig wird, Master wieder mit meinem sich entwickelnden Zweig zu verschmelzen. So gut wie alle meine Änderungen werden zu Merge-Konflikten, was sehr mühsam ist. Ist das eine unvermeidliche Konsequenz davon, meinen sich entwickelnden Zweig vom zerquetschten Meister getrennt zu halten? –

17

Nein, aber Sie können alle commits ziemlich leicht zusammen quetschen. Für das folgende Beispiel, werde ich Sie auf dem master Zweig sind, anzunehmen, zu dem entfernten trunk Zweig entspricht, und dass Sie alle lokalen zerquetschen verpflichtet zusammen:

git tag local # create a temporary tag 
git reset --hard trunk 
git merge --squash local 
git commit # write your single commit message here 
git svn dcommit 
git tag -d local # delete the temporary tag named local 

stattdessen eine temporäre Tag verwenden könnten Sie verwenden auch nur die reflog

+0

das ist total cool, das ändert meinen Workflow komplett, vielen Dank –

3

Wenn ich mit git-svn arbeite und möchte, dass eine Reihe von Git-Commits als ein einzelnes Commit angezeigt wird, arbeite ich an einem Zweig des Themas und mache dann einen Non-Fast-Forward merge in Master vor dcommit -ing.

Zuerst Ihr Zweig gegen svn rebase und sicher lokalen Master-Make-up-to-date ist:

git svn rebase && git push . remotes/trunk:master 

Dann Master wechseln, fusionieren und dcommit:

git checkout master 
git merge <branch> --no-ff -m "Message you want in svn" 
git svn dcommit 

Dies wird sich zeigen als ein einzelnes Commit in Subversion, aber Sie haben immer noch Ihren lokalen Verlauf, der Sie zu diesem Commit gebracht hat.

         +--- Merge commit 
             V 
svn trunk *---*---*-------------------*--- --- --- 
        \    /
topic branch   *---*---*---*---* 
3

Ein einfacher Weg sein könnte (falls Sie mehrere haben Commits auf dem lokalen System angehäuft):

git reset <hash tag of commit till which u need to combine> 
git commit -am "your message" // This will create one clubbed commit of all the commit till the hash tag used. 
+2

Stellen Sie sicher, dass Sie neue Dateien hinzufügen. "git commit -am" fügt keine neuen Dateien hinzu. –

+0

Alternativ dazu können Sie mit reset --soft alle Änderungen in den Status übernehmen, so dass Sie sich keine Gedanken über das Hinzufügen von Dateien oder die Verwendung von -a machen müssen. – PeterJCLaw

0

, die nicht für mich arbeitet. Ich benutze merge --no-ff --no-commit aber nach begehen, ich habe:

svntrunk      54f35e4 [trunk: ahead 336] release 1 

dcommitting zu trunkwill alle 336 Commits zu begehen.

Zurücksetzen, Markieren und Quetschen wie in Antwort # 2 beschrieben: Combine local Git commits into one commit for git-svn wird funktionieren, aber beim nächsten "Merge" werden Sie einige Probleme haben, um alle Commits wieder zusammen zu bekommen!

die einzigen, die für mich funktioniert:

git checkout -tb svntrunk remotes/trunk 
git merge --no-commit --squash master 

alle Commits von Meister zu erhalten, ohne svn Geschichte für zukünftige zu verlieren mit dem gleichen Befehl verschmelzenden

~ Marcel