Während ich in einem Subversion-Repo gespeicherte Programmiersoftware programmiere, ändere ich häufig einige Dateien und stelle dann fest, dass ich einige vorbereitende Änderungen für meine Hauptarbeit vornehmen möchte. Während ich beispielsweise neue Funktionen implementiere, bemerke ich einige Umgestaltungen, die mir helfen könnten.
Um zwei nicht zusammenhängende Änderungen nicht zu mischen, möchte ich in diesen Fällen meine Änderungen "verstauen", dh zur Repository-Version zurückkehren, einige andere Änderungen vornehmen, diese festschreiben und dann meine Änderungen "zurückholen".
git-stash ermöglicht genau das. Gibt es eine Möglichkeit, dies mit Subversion entweder direkt oder mit einem Plugin oder Skript zu tun? Eclipse-Plugins wären auch in Ordnung.
quelle
Antworten:
Wenn ich nicht festgeschriebene Änderungen von einer Aufgabe in meiner Arbeitskopie habe und zu einer anderen Aufgabe wechseln muss, mache ich eines von zwei Dingen:
Überprüfen Sie eine neue Arbeitskopie für die zweite Aufgabe.
oder
Starten Sie einen Zweig:
Ich habe einige Skripte, die helfen, dies zu automatisieren.
quelle
project\temp\<creationdate-reason>
oderproject\personal\<creationdate-reason>
zu diesem Zweck bestimmen.Dieser Blog-Beitrag empfiehlt die Verwendung von Diff und Patch.
git stash
ungefähr wirdsvn diff > patch_name.patch; svn revert -R .
git stash apply
wirdpatch -p0 < patch_name.patch
Beachten Sie, dass hierdurch keine Metadatenänderungen gespeichert oder (glaube ich) Verzeichnisse erstellt / gelöscht werden. (Ja, svn verfolgt diese im Gegensatz zu git getrennt vom Verzeichnisinhalt.)
quelle
svn patch patch_name.patch
anstelle von verwendenpatch -p0
, da sie in der Patch-Datei enthalten sind und der SVN-Patch sie versteht.Sie können Ihre aktuellen Änderungen mit
svn diff
in einer Patch-Datei speichern und dann Ihre Arbeitskopie zurücksetzen:Nachdem Sie Ihre vorbereitende Funktion implementiert haben, können Sie Ihren Patch mit dem Patch-Dienstprogramm anwenden:
Wie andere angemerkt haben, funktioniert dies nicht mit
svn:properties
Baumoperationen (Hinzufügen, Entfernen, Umbenennen von Dateien und Verzeichnissen).Binärdateien könnten auch Probleme verursachen, ich weiß nicht, wie Patch (oder TortoiseSVN in diesem Fall behandelt sie).
quelle
$ patch --strip=0 < stash.patch
Dadurch wird sichergestellt, dass der Patch Sie beim Anwenden Ihres Patches nicht nach dem Dateinamen fragt.Der einfachste Weg wäre, einen temporären Zweig wie diesen zu verwenden:
Dies könnte (und sollte wahrscheinlich) in ein Skript eingefügt werden, wenn es regelmäßiger durchgeführt wird.
quelle
Ab 1.10.0 (2018-04-13) haben Sie einen experimentellen
svn shelve
Befehl . ( TortoiseSVN unterstützt den Befehl ) Es ist nichts anderes als ein Helfer, um einen Patch zu speichern und wieder anzuwenden, daher gibt es dieselben Einschränkungen wiesvn diff
+patch
(dh es können keine Binärdateien verarbeitet und umbenannt werden). ( Bearbeiten : Es sieht so aus, als ob die nächste Version 1.11.0 Binärunterstützung bietet. )Bearbeiten ^ 2: Mit 1.11.0 (veröffentlicht am 30.10.2018) werden Binärdateien unterstützt . Das Umbenennen umbenannter Dateien wurde nicht unterstützt. Regale in 1.11 sind nicht kompatibel mit Regalen, die mit 1.10 erstellt wurden.
Bearbeiten ^ 3: Mit 1.12.0 (veröffentlicht am 24.04.2019) werden Kopieren und Umbenennen unterstützt . Regale in 1.12 sind nicht kompatibel mit Regalen, die von früheren Versionen erstellt wurden.
Bearbeiten ^ 4: Mit 1.13.0 und 1.14.0 gibt es keine Änderung in Bezug auf Regale . Befehle sind weiterhin als experimentell markiert und müssen definiert werden
SVN_EXPERIMENTAL_COMMANDS=shelf3
, um die Funktion zu aktivieren. Es sieht so aus, als ob die Funktion derzeit nicht getestet wurde .Design-Hinweise finden Sie im Entwickler- Wiki .
quelle
Ich kenne keinen einfachen Weg, dies mit nur svn zu tun. Ehrlich gesagt würde ich empfehlen
git-svn
, ein Git-Repo zu erstellen, das als SVN-Arbeitskopie fungiert, und nur damit zu verwendengit stash
. Ersetzen Sie einfachgit pull
mitgit svn rebase
undgit push
mitgit svn dcommit
und Sie können tatsächlich halten 90% der git Workflow und immer noch zu einem SVN - Server sprechen.quelle
svn-stash
Unter GPL 3 ist ein kleines Python 2-Skript namens https://github.com/frankcortes/svn-stash verfügbar .Es funktioniert wie die
svn diff/patch
genannten Lösungen und bietet das Verschieben und Löschen von Änderungen, wenn sie sich in einem lokalen Verzeichnis unterscheiden. Leider können die Verstecke nicht benannt werden und nur der letzte kann geknallt werden (nun ja, es ist ein Stapel, aber es gibt keinen wirklichen Grund für eine solche Einschränkung.) Aber dann könnten Sie immer die fehlenden Funktionen in die einbauen Quelle.Es ist für * ix geschrieben, aber nach dem Ersetzen jedes "/"
os.sep
funktioniert es auch unter Windows gut.Wenn Sie svn 1.7 oder höher verwenden, müssen Sie Folgendes ändern
is_a_current_stash()
: Entfernen Sie die Zeileif ".svn" in os.listdir(CURRENT_DIR):
, da in 1.7-WCs nur ein .svn-Unterverzeichnis der obersten Ebene vorhanden ist.quelle
Mit Intellij IDEA - Shelve Changes können Sie dies ganz einfach tun
quelle
metadata changes
und umgehendirectory creates/deletes
? Wie genau wasgit stash
macht?Eine andere Möglichkeit besteht darin, Ihre aktuelle Kasse in ein neues Verzeichnis zu kopieren und alle Ihre Änderungen zurückzusetzen. Auf diese Weise ersparen Sie sich den Aufwand, einen temporären Zweig auf Ihrem Server zu erstellen - schließlich ist das Verstecken eine lokale Operation, die nicht jeder sehen sollte und die ziemlich oft ausgeführt werden kann.
Nach dem Festschreiben Ihres Hotfixes können Sie Ihre Hauptarbeitskopie aktualisieren und Ihren "Versteckbereich" löschen.
quelle
Ich wollte auch diese Funktion. Ich benutze derzeit TortoiseSVN.
Ich habe keine feste Lösung gefunden, außer den Baum zu exportieren, zum Repository zurückzukehren, meine Änderungen vorzunehmen und festzuschreiben und dann die Änderungen aus dem exportierten Baum mit einem Tool wie Beyond Compare wieder in mein quellgesteuertes Verzeichnis zu vergleichen.
Eine andere Lösung könnte darin bestehen, vom HEAD in ein anderes Verzeichnis zu verzweigen, Ihre Änderungen vorzunehmen und das Commit durchzuführen. Wenn Sie bereit sind, diese wieder mit Ihrer anderen Arbeitskopie zusammenzuführen, führen Sie ein Update durch und führen Sie Ihre Änderungen zusammen.
quelle
Ich behalte immer eine zweite Kasse, die ich "trunk_clean" nenne. Wann immer ich eine schnelle, isolierte Änderung in Bezug auf das, was ich tue, vornehmen muss, verpflichte ich mich stattdessen nur zu dieser Kasse.
quelle
Die obigen Verzweigungs- und Patching-Ideen sind großartig, aber sie funktionieren für mich nicht gut. Ich verwende ein visuelles Diff-Tool, sodass beim Ausführen
git diff
keine textbasierten Patches erzeugt werden. Unser Build-System startet jedes Mal, wenn ein Zweig erstellt wird, eine neue Umgebung, sodass das Erstellen temporärer "Stash" -Zweige unübersichtlich wird.Stattdessen habe ich ein kleines Shell-Skript geschrieben , das eine Datei in ein "Regal" -Verzeichnis kopiert, einen Zeitstempel hinzufügt und die Änderung zurücksetzt. Es ist nicht so robust wie die oben genannten Lösungen, aber es vermeidet auch einige der Fallstricke, auf die ich gestoßen bin.
quelle
Basierend auf der Antwort von Walter habe ich die folgenden Aliase in meiner bashrc-Datei erstellt:
Diese Aliase sind viel einfacher zu verwenden und zu merken.
Verwendungszweck:
svn.stash , um Änderungen zu speichern , und svn.stash.apply , um Stash anzuwenden.
quelle
In meiner Praxis
git init
erstelle ich ein Git-Repository imtrunk
Verzeichnis meines Subversion-Repositorys und füge*.git
dann den Suctions-Ignoriermustern hinzu.Wenn ich nach dem Ändern einiger Dateien meine Arbeit mit der Subversion-Hauptzeile fortsetzen möchte, verwende ich sie nur
git stash
zum Verstecken meiner Arbeit. Nach dem Festschreiben im Subversion-Repositorygit stash pop
stelle ich meine Änderungen wieder her.quelle
Verwenden:
Es wird ein Zweig aus dem aktuellen Speicherort und der aktuellen Revision erstellt und anschließend die Änderungen in der Arbeitskopie in diesen Zweig übernommen, ohne zu diesem zu wechseln.
Beachten Sie, dass Änderungen in der Arbeitskopie nicht automatisch zurückgesetzt werden (
cp
nur das Kopieren von Änderungen in einen neuen Zweig) und Sie sie manuell zurücksetzen müssen.Um die Änderungen wiederherzustellen, können Sie die Änderungen aus dem neu erstellten Zweig einfach mit Ihrer Arbeitskopie zusammenführen.
--ignore-ancestry
wird verwendet, um die Zusammenführungsinformationen in der Arbeitskopie nicht zu aktualisieren.Verwenden:
um zu sehen, was Sie auf dem Versteckweg haben. Festgeschriebene Revisionen werden ebenfalls gedruckt.
Wenn Sie das Versteck nicht mehr benötigen, führen Sie einfach Folgendes aus:
Diese Lösung ist insofern besser als die Verwendung von Patches, als wenn neue Änderungen in der Arbeitskopie oder im aktuellen Zweig mit den Änderungen im Stash in Konflikt stehen, Sie die Konflikte mit svn-Mitteln lösen können, während
patch
Patches in einigen Fällen einfach fehlschlagen oder sogar falsch angewendet werden .quelle
Da Subversion die Funktion nicht
stash
perfekt unterstützt,mache ich einfach so manuell.
Platzieren
Development
undProduction(release)
auf einen getrennten Pfad projizieren.Sie können alle neuen Funktionen für Ihr Projekt im Entwicklungspfad bearbeiten,
und Sie würden nur bedeutende Fortschritte erzielen, oder es sollte etwas für den Stall freigegeben werden.
Wenn Sie es für die Produktion freigeben müssen, öffnen Sie das Produktionsprojekt, aktualisieren Sie svn und erledigen Sie die Freigabe (Erstellen, Exportieren usw.).
Ich weiß, dass dies ein bisschen mühsam ist, aber das Freigeben von Fortschritten kommt nicht oft vor (es ist nicht für mich, aber ich weiß, dass einige Projekte dies tun), verglichen mit dem Entwickeln von Fortschritten. Dieser Weg passt zu mir.
Ich benutze svn für bestimmte Projekte, da die Mitglieder des Projektteams es verwenden, also muss ich folgen.
Die beste Lösung ist die Verwendung
git
eines perfekten Versionskontrollsystems und besser alssvn
.quelle
dev
undprod
, 2 Situationen. Die Entwicklung völlig neuer Funktionen wäre mit svn kompliziert. Ich bin mir nicht sicher, ob es eine klare Methode gibt, um Ihren Fall in der SVN-Welt zu lösen.