2008-10-01 6 views
42

Nach the manual, git dcommit "wird eine Revision in SVN für jeden Commit in Git erstellen." Aber gibt es eine Möglichkeit, mehrere Subversion Revisionen zu vermeiden? Das heißt, git alle Änderungen zusammenführen vor der Durchführung der svn commit?Ist es möglich, git svn dcommit Ergebnis in einem einzigen SVN Commit zu machen?

+0

Ich habe das gleiche Problem. Stellen Sie sich vor, Sie klonen einen SVN Repo zu git als Ihren Master, Sie machen 3 Commits mit verschiedenen Nachrichten und verwenden dann git svn dcommit. Ist es möglich, diese 3 Commits in einem einzigen zusammenzufassen? Wie kannst du das machen ? Können Sie uns ein Beispiel geben? Thnks! – sergiofbsilva

+0

Mögliches Duplikat von [Kombiniere lokale Git-Commits zu einem Commit für git-svn] (http://stackoverflow.com/questions/1408381/combine-local-git-commits-into-one-commit-for-git-svn) – centic

Antwort

34

Wenn Sie auf einem Zweig in Git arbeiten, können Sie git-merge --squash, die das innerhalb Git tut. Du könntest dann diesen einen gequetschten Commit zu SVN schieben.

Natürlich sind viele kleine Commits gut, also warum sollten Sie sie zerquetschen wollen?

+0

Danke!(Normalerweise möchte ich viele kleine Commits, aber das betrifft ein Client-Projekt, wo ich und mein Partner häufig Änderungen zwischen einander vornehmen müssen, und oft sogar Änderungen, die den Kofferraum brechen würden.) – plindberg

+0

Warum arbeiten Sie beide nicht weiter? der selbe (svn) Zweig, dann? –

+2

Ich benutze viele kleine Commits, um Änderungen leicht nachvollziehen zu können. Wenn ich an den SVN-Server sende, generieren wir eine E-Mail für jeden SVN-Commit. Ich würde lieber die zusätzliche Arbeit der Rückführung zum Master mit Squash für "Logical Unit" Commits machen und jedem ein paar E-Mails speichern. – cbowns

27

Der Befehl git rebase -i kann dies und mehr tun. Dieser Befehl ist extrem mächtig, also ist es gut, sich damit anzufreunden.

Die Syntax lautet: git rebase -i <commit ID>. Dies öffnet den Texteditor mit Optionen (und Anweisungen) zum Ändern aller Commits bis zur angegebenen ID (ohne diese).

Zum Beispiel die vorherigen 5 Commits zu ändern, können Sie dies tun:

git rebase -i HEAD~5

Oder wenn Ihr SVN Zweig "svn/trunk" genannt wird, dann ist diese Syntax ist auch gut:

git rebase -i svn/trunk

Dann erscheint ein Texteditorfenster. Um alles zu zerquetschen, ändern Sie das erste Wort jeder Zeile nach dem ersten von "Pick" zu "Squash" (Wenn das verwirrend klingt - wird es mehr Sinn machen, wenn Sie es sehen). Speichere und schließe den Editor. Sie haben dann die Möglichkeit, die Commit-Nachricht für das gequetschte Commit zu bearbeiten.

Zu den anderen Dingen, die Sie mit git rebase -i tun können, sind das Neuordnen von Commits, das Quittieren von Commits auf verschiedene Arten und das Entfernen von Commits.

Ich benutze diesen Befehl ständig; es ist eine Killereigenschaft von Git.

7

Ryan Tomayko schrieb ein wenig über git rebase -i, die er sagte:

... [es ist] ein bisschen wie git commit --amend auf Säure hüpfte und eine Kettensäge halten - völlig verrückt und ziemlich gefährlich, aber fähig ist völlig neue Geisteszustände freilegen. Hier können Sie bestehende Commits auf eine intuitiver und intuitiver Weise bearbeiten, komprimieren, neu anordnen, auseinander reißen und kommentieren.

Ich habe eine Tendenz in git zu begehen oft, aber wollen nicht unbedingt dcommit jeder verpflichten, SVN und Quetschen alle meine Arbeit ebenso wenig Sinn macht. Ich versuche es jetzt neu zu ordnen und ein paar zusammen in logischere Commit-Einheiten zu zerquetschen.