Partielle Commits mit Subversion


104

In diesem Fall habe ich zwei unabhängige Änderungen in einer Datei vorgenommen: z. fügte eine neue Methode hinzu und änderte eine andere Methode.

Ich möchte oft nicht beide Änderungen als ein Commit festschreiben, sondern als zwei unabhängige Commits.

In einem Git-Repository würde ich den interaktiven Modus von Git-Add (1) verwenden , um das Stück in kleinere aufzuteilen :

 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".


Haben Sie speziell nach einer Lösung in der Befehlszeile gesucht? In vielen der folgenden Antworten wird TortoiseSVN 'Nach Festschreiben wiederherstellen' erwähnt, eine Funktion, die nur für Schildkröten gilt - also GUI- und Windows-basiert.
Florida

Antworten:


35

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

git-svn (1)


24
In dieser Lösung steckt eine besondere Ironie.
Smoking

65

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

Gemäß der Dokumentation:

So legen Sie nur die Teile der Datei fest, die sich auf ein bestimmtes Problem beziehen:

  1. Klicken Sie im Festschreibungsdialog mit der rechten Maustaste auf die Datei und wählen Sie "Nach Festschreibung wiederherstellen".
  2. Bearbeiten Sie die Datei in z. B. TortoiseMerge: Machen Sie die Änderungen rückgängig, die Sie noch nicht festschreiben möchten
  3. Speicher die Datei
  4. Übernehmen Sie die Datei

Ich frage mich, wie das funktioniert. Ich habe die Versionshinweise zu SVN 1.8 überprüft , kann jedoch nicht herausfinden, auf welcher Funktion "Nach Festschreiben wiederherstellen" basiert.
DavidS

3
@DavidS Dies ist keine Funktion von SVN. Es ist eine Funktion von TortoiseSVN.
Florida

Zu
Greg K

Wir können es auch in der Dokumentation hier finden: tortoisesvn.net/docs/release/TortoiseSVN_en/…
Guillaume Husta

42

Ich habe dies mit TortoiseSVN gemacht .

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

Verwenden Sie die Funktion zum Erstellen eines Backups des Dienstprogramms diff

  1. Gehen Sie zum Festschreiben Ihrer Datei, als würden Sie alle Ihre Änderungen festschreiben.
  2. Doppelklicken Sie im Festschreibungsfenster auf die Datei, um einen Unterschied anzuzeigen.
  3. Klicken Sie in den Diff-Einstellungen auf die Option zum Sichern der Originaldatei .
  4. Klicken Sie mit der rechten Maustaste auf die Änderungen, die Sie nicht möchten, und verwenden Sie select, um einen anderen Textblock zu verwenden .
  5. Speichern Sie den Diff genau einmal . Das Backup 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. Übernehmen Sie Ihre Datei.

Sie sollten jetzt alle Ihre Änderungen mit zwei separaten Festschreibungen festschreiben lassen.


1
Wie genau hast du das gemacht? Ich würde gerne diese Technik lernen.
Lasse V. Karlsen

Es wäre so ordentlich, wenn dies nach einem Commit automatisch mit den .bak-Dateien überschrieben würde.
BCS

Ich habe die Option Schritt 3: Sicherung mit Tortoise SVN 1.8.1
sudhAnsu63 vom

4
Keine Ursache. Es wurde der entsprechende Link für 1.8 gefunden. Tortoisesvn.net/tsvn_1.8_releasenotes.html Um nur die Teile der Datei festzuschreiben , die sich auf ein bestimmtes Problem beziehen: Klicken Sie im Festschreibungsdialog mit der rechten Maustaste auf die Datei und wählen Sie "Nach Festschreiben wiederherstellen". Bearbeiten Sie die Datei in zB TortoiseMerge: Machen Sie die Änderungen rückgängig, die Sie noch nicht
festschreiben

Leider scheint dies in Tortoise Version 1.8.5 nicht verfügbar zu sein und wird auch nicht nach dem Festschreiben wiederhergestellt.
Kajaco

24

Versuchen Sie es mit svn diff > out.patchund kopieren Sie die out.patchDatei nach out.patch.addundout.patch.modify

Nur wenn Sie eine funktionierende Patch-Datei haben, können Sie die Originaldatei mit zurücksetzen svn revert out.c.

Bearbeiten Sie die Patch-Dateien von Hand, sodass sie nur die Hunks zum Hinzufügen oder Ändern enthalten. Wenden Sie sie mit dem patchBefehl auf die Originaldatei an , testen Sie, ob die Addition funktioniert hat, und dann svn commitdie Addition.

Waschspülung für das out.patch.modifyPflaster wiederholen .

Wenn die Änderungen in der Datei getrennt sind, wie in Ihrer ersten 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 Commits zu trennen.

Sie hätten auch mehrere Arbeitskopien derselben Quelle auschecken können, um Ihre Arbeit gegen Folgendes anzuwenden:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

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


11

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

4.4.1. Der Commit-Dialog

Wenn Ihre Arbeitskopie aktuell ist und keine Konflikte vorliegen, können Sie Ihre Änderungen übernehmen. Wählen Sie eine Datei und / oder einen Ordner aus, die Sie festschreiben möchten, und wählen Sie dann TortoiseSVN → Festschreiben ....

<Snip>

4.4.3. Übernehmen Sie nur Teile von Dateien

Manchmal möchten Sie nur Teile der Änderungen festschreiben, die Sie an einer Datei vorgenommen haben. Eine solche Situation tritt normalerweise auf, wenn Sie an etwas arbeiten, aber dann muss ein dringender Fix festgeschrieben werden, und dieser Fix befindet sich zufällig in derselben Datei, an der Sie arbeiten.

Klicken Sie mit der rechten Maustaste auf die Datei und verwenden Sie das Kontextmenü → Nach dem Festschreiben wiederherstellen. Dadurch wird eine Kopie der Datei erstellt, wie sie ist. Anschließend können Sie die Datei bearbeiten, z. B. in TortoiseMerge, und alle Änderungen rückgängig machen, die Sie nicht festschreiben möchten. Nach dem Speichern dieser Änderungen können Sie die Datei festschreiben.

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

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


8

Ich habe das gemacht:

  • Bearbeiten Sie die Datei in meinem Editor (ich verwende vim) so, dass nur eine der Änderungen angezeigt wird
  • Speichern Sie die Datei (aber beenden Sie den Editor nicht)
  • Übernehmen Sie die geänderte Datei in svn
  • Klicken Sie im Editor so oft auf "Rückgängig", dass die zweiten Änderungen erneut angezeigt werden
  • Speichern Sie die Datei erneut
  • Übernehmen Sie die zweiten Änderungen.

Dies ist ein vereinfachter Ansatz, bei dem davon ausgegangen wird, dass eine Reihe von Änderungen relativ einfach rückgängig gemacht werden kann. In komplexeren Situationen würde ich beide Änderungen aufgeben und festschreiben, ohne mir darüber Sorgen zu machen.

Jetzt, wo ich Git benutze, hoffe ich, dass ich das nie wieder tun muss!


4

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

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

Führen Sie die zugehörigen Änderungen zusammen, speichern Sie die Zusammenführung und beenden Sie das Zusammenführungsprogramm

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

Wenn mehr als ein nicht verwandtes Stück in der Datei enthalten ist, spülen Sie es aus und wiederholen Sie es (aber warum sollten Sie so lange warten, bevor Sie es festschreiben?!)

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


9
Re: "Warum so lange warten?" Du machst den ganzen Tag einen großen Refactor und der Boss lässt kurz vor dem Mittagessen einen kleinen Fix-this-now-Fehler fallen.
BCS


2
  1. Öffnen Sie alle Dateien, die Sie teilen möchten, im Editor Ihrer Wahl
  2. Verwenden Sie einen anderen Werkzeugsatz (verwenden Sie unter Win den Vorschlag von Spike (die alte Version)), um den zweiten Satz zurückzusetzen
  3. Verpflichten
  4. Gehen Sie zurück zu dem Editor Ihrer Wahl und speichern Sie alle Dateien

Es ist etwas riskanter als Spikes vollständiger Vorschlag, kann aber einfacher sein. Stellen Sie außerdem sicher, dass Sie es zuerst mit etwas anderem versuchen, da einige Editoren sich weigern, eine Datei zu speichern, die sich unter ihnen geändert hat, es sei denn, Sie laden diese Datei neu (wobei alle Änderungen verloren gehen).


0

Ich denke, eine einfachere Option als das Generieren von Diff-Dateien, das Zurücksetzen usw. wäre, zwei Kopien des Repositorys auszuchecken 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. Sobald Sie eine Menge Änderungen am ersten vorgenommen haben, können Sie einen Abschnitt in den zweiten kopieren, festschreiben, einen anderen Abschnitt kopieren, festschreiben usw.


0
  1. Kopieren Sie alle betroffenen geänderten Dateien in Sicherungskopien.
  2. Erstellen Sie mit einen Patch des Arbeitszustands svn diff.
  3. Setzen Sie die Dateien mit zurück svn revert.
  4. Wenden Sie die Teile des Patches, die Sie festschreiben möchten, entweder mit dem patchTool oder durch manuelle Bearbeitung oder was auch immer erneut an.
  5. Führen Sie diffanschließend aus, um Ihre Arbeitskopie mit Ihrem Backup zu vergleichen und sicherzustellen, dass Sie die Patch-Teile korrekt 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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.