it-swarm-eu.dev

Teilweise Commits mit Subversion

In dem Fall habe ich zwei unabhängige Änderungen in one file vorgenommen: zB. eine neue Methode hinzugefügt und eine andere Methode geändert.

Ich möchte oft nicht beide Änderungen als one begehen, sondern als zwei unabhängige Commits.

In einem Git-Repository würde ich den Interactive Mode von git-add (1) verwenden, um den Hunk in kleinere zu teilen:

 git add --patch

Was ist der einfachste Weg, dies mit Subversion zu tun? (Vielleicht sogar mit einem Eclipse-Plug-In)

Update:
In The Thing About Git nennt Ryan es: "The Tangled Working Copy Problem."

96

Mit git-svn können Sie ein lokales GIT-Repository des Remote-SVN-Repositorys erstellen, mit dem vollständigen GIT-Funktionssatz (einschließlich partieller Commits) damit arbeiten und dann alles in das SVN-Repository zurückschieben.

git-svn (1)

32
jkramer

Tortoise SVN 1.8 unterstützt jetzt dies mit der Funktion "Wiederherstellen nach dem Festlegen". Dadurch können Sie Änderungen an einer Datei vornehmen, wobei alle Änderungen nach dem Festschreiben rückgängig gemacht werden

Per Dokumentation:

Festschreiben nur der Teile der Datei, die sich auf ein bestimmtes Problem beziehen:

  1. klicken Sie im Commit-Dialog mit der rechten Maustaste auf die Datei und wählen Sie "Restore after Commit".
  2. bearbeiten Sie die Datei in z. TortoiseMerge: Machen Sie die Änderungen rückgängig, die Sie noch nicht festlegen möchten
  3. speicher die Datei
  4. Übernehmen Sie die Datei
58
Casebash

Ich habe dies mit TortoiseSVN gemacht.

Mit dem integrierten Merge-Dienstprogramm können Sie einen Unterschied zwischen der Repository-Version und Ihrer Arbeitskopie anzeigen.

Verwenden Sie die Funktion create backup des Dienstprogramms diff

  1. Beginnen Sie mit der Festschreibung Ihrer Datei, als ob Sie alle Ihre Änderungen festschreiben würden.
  2. Doppelklicken Sie im Commit-Fenster auf die Datei, um ein Diff anzuzeigen.
  3. Klicken Sie in den Diff-Einstellungen auf die Option Originaldatei sichern
  4. Klicken Sie mit der rechten Maustaste auf die gewünschten Änderungen und wählen Sie anderen Textblock verwenden aus.
  5. Speichern Sie den Unterschied einmal genau. Die Sicherung wird bei jedem Speichern überschrieben. Deshalb möchten Sie nur einmal speichern.
  6. Übernehmen Sie die Änderung.
  7. Überschreiben Sie das Original mit der erstellten .bak-Datei (die alle Ihre ursprünglichen Änderungen enthält).
  8. Übertragen Sie Ihre Datei.

Sie sollten jetzt alle Ihre Änderungen festlegen, indem Sie zwei separate Commits verwenden.

42
Spike

Versuchen Sie es mit svn diff > out.patch und kopieren Sie dann die out.patch-Datei nach out.patch.add und out.patch.modify

Nur wenn Sie eine funktionierende Patch-Datei haben setzen Sie die Originaldatei mit svn revert out.c zurück.

Bearbeiten Sie die Patch-Dateien von Hand so, dass sie nur die hunks zum Hinzufügen oder Ändern enthalten. Wenden Sie sie mit dem Befehl patch auf die Originaldatei an, testen Sie, ob der Zusatz funktioniert, und svn commit den Zusatz.

Waschspülwiederholung für den out.patch.modify-Patch.

Wenn die Änderungen in der Datei separat sind, wie in der ursprünglichen Frage angegeben - eine neue Methode hinzugefügt, eine vorhandene Methode geändert - funktioniert dies

Dies ist eine sehr langwierige Lösung - obwohl ich nicht überzeugt bin, dass Sie einen Grund haben sollten, Ihre Verpflichtungen zu trennen.

Sie könnten auch mehrere Arbeitskopien derselben Quelle ausgecheckt haben, gegen die Ihre Arbeit angewendet werden soll:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Stellen Sie sicher, dass Sie svn up und testen, um sicherzustellen, dass alles in Ordnung ist.

25
Chris

Dies ist mit TortoiseSvn (Windows) seit Version 1.8 möglich.

4.4.1. Der Commit-Dialog

Wenn Ihre Arbeitskopie auf dem neuesten Stand ist und keine Konflikte vorliegen, können Sie Ihre Änderungen übernehmen. Wählen Sie eine beliebige Datei und/oder Ordner, die Sie übergeben möchten, dann TortoiseSVN → Commit ....

<Schnipsel>

4.4.3. Übertragen Sie nur Teile von Dateien

Manchmal möchten Sie nur einen Teil der an einer Datei vorgenommenen Änderungen festschreiben. Eine solche Situation normalerweise passiert, wenn Sie an etwas arbeiten, aber eine dringende Lösung erforderlich ist festgeschrieben werden, und der Fix befindet sich zufällig in derselben Datei wie Sie arbeiten an. 

klicken Sie mit der rechten Maustaste auf die Datei und verwenden Sie Kontextmenü → Wiederherstellen nach dem Festschreiben . Dadurch wird eine Kopie der Datei so wie sie ist erstellt. Dann können Sie die .__ bearbeiten. Datei, z.B. Machen Sie in TortoiseMerge alle Änderungen rückgängig, die Sie nicht möchten verpflichten. Nach dem Speichern dieser Änderungen können Sie die Datei festschreiben. 

Nach dem Festschreiben wird die Kopie der Datei wiederhergestellt automatisch, und Sie haben die Datei mit all Ihren Änderungen, die wurden nicht zurückgegeben.

Unter Linux würde ich http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php versuchen. Ich habe es selbst nicht ausprobiert.

10
parvus

Ich habe das gemacht:

  • Bearbeiten Sie die Datei in meinem Editor (ich verwende vim), sodass nur eine der Änderungen angezeigt wird
  • Speichern Sie die Datei (aber beenden Sie den Editor nicht)
  • Übertragen Sie die geänderte Datei in svn
  • Drücken Sie im Editor mehrmals auf "Rückgängig machen", damit der zweite Satz von Änderungen erneut angezeigt wird
  • Speichern Sie die Datei erneut
  • Übernehmen Sie den zweiten Satz von Änderungen.

Dies ist ein vereinfachter Ansatz, der davon ausgeht, dass ein Satz Änderungen leicht rückgängig gemacht werden kann. Bei komplexeren Situationen würde ich beide Änderungen aufgeben und festlegen, ohne mir Sorgen zu machen.

Nun, da ich git benutze, hoffe ich, dass ich es nie wieder tun muss!

8
Greg Hewgill

Ich verwende entweder ein lokales Darcs-Repo oder füge die Änderungen einfach zusammen. Beim Zusammenführen (opendiff öffnet FileMerge, ein Zusammenführungsprogramm, das mit Xcode geliefert wird; ersetzen Sie es mit Ihrem bevorzugten Zusammenführungswerkzeug):

cp file file.new
svn revert file
opendiff file.new file -merge file

zusammenführen der Änderungen, Speichern der Zusammenführung, Beenden des Zusammenführungsprogramms

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

wenn sich mehr als ein nicht zusammenhängendes Stück in der Datei befindet, spülen und wiederholen (aber warum sollten Sie so lange warten, bevor Sie ein Commit ausführen ?!)

Wenn Sie git kennen, können Sie git-svn verwenden, um ein lokales git-Repo zu verwalten und Ihre Commits mit einem svn-Masterserver zu synchronisieren. funktioniert gut in meiner begrenzten Erfahrung.

5
Aeon

Versuchen Sie VisualSVN für Visual Studio . Die latest 6.1-Version führt die QuickCommit-Funktion ein. Sie können ausgewählte Änderungen in einer Datei teilweise festschreiben, indem Sie die neuen Kontextmenübefehle Commit this Block und Commit Selection im Visual Studio-Editor verwenden.

 enter image description here

3
bahrep
  1. Öffnen Sie alle Dateien, die Sie teilen möchten, im Editor nach Wahl
  2. Verwenden Sie einen anderen Werkzeugsatz (unter Windows verwenden Sie den Vorschlag von Spike (die alte Version)) und setzen Sie den zweiten Satz zurück
  3. Verpflichten
  4. gehen Sie zurück zu Ihrem Editor und speichern Sie alle Dateien

Es ist ein bisschen riskanter als der volle Vorschlag von Spike, kann aber einfacher sein. Stellen Sie außerdem sicher, dass Sie es zuerst bei etwas anderem ausprobieren, da einige Editoren es ablehnen, über eine Datei zu speichern, die sich von ihnen geändert hat, es sei denn, Sie laden die Datei neu (verlieren alle Ihre Änderungen)

2
BCS

Ich denke, eine einfachere Option als das Generieren von diff-Dateien, das Zurücksetzen usw. wäre, zwei Kopien des Repositorys auschecken zu lassen und ein visuelles Diff-Tool wie DeltaWalker zu verwenden, um Hunks von einem zum anderen zu kopieren.

Die erste Kopie wäre die, an der Sie tatsächlich arbeiten, und die zweite wäre nur für diesen Zweck. Wenn Sie eine Menge Änderungen an dem ersten vorgenommen haben, können Sie einen Abschnitt in den zweiten kopieren, einen Commit ausführen, einen anderen Abschnitt kopieren, einen Commit ausführen usw.

0
Ian Dunn
  1. Kopieren Sie alle betroffenen modifizierten Dateien in Sicherungskopien.
  2. Erstellen Sie mit svn diff einen Patch des Arbeitsstatus.
  3. Setzen Sie die Dateien mit svn revert zurück.
  4. Wenden Sie die Teile des Patches, die Sie festschreiben möchten, erneut an, entweder mit dem Werkzeug patch oder durch manuelle Bearbeitung oder was auch immer.
  5. Führen Sie anschließend diff aus, um Ihre Arbeitskopie mit Ihrer Sicherung zu vergleichen, um sicherzustellen, dass Sie die Patch-Teile richtig angewendet haben.
  6. Bauen und testen.
  7. Verpflichten.
  8. Kopieren Sie Ihre Sicherungskopien zurück in Ihren Repository-Check-Out.
  9. Wiederholen Sie dies bei 2. (nicht bei 1.!), Bis Sie fertig sind.
0
michaeljt