Wie verwerfe ich lokale Änderungen in einer SVN-Kasse?

197

Ich wollte ein Diff zur Überprüfung für ein Open Source-Projekt einreichen .

Ich habe den Code mit SVN (vom Terminal Ubuntu) erhalten. Und ich habe kleinere Änderungen in wenigen Dateien vorgenommen. Jetzt gibt es nur noch eine einzige Änderung, die ich einreichen möchte. Die restlichen Änderungen, die ich vorgenommen habe, waren für das Debuggen bestimmt und werden nicht mehr benötigt.

Ich habe diff mit generiert svn di > ~/os/firstdiff.diff

Also meine Frage: Wie kann ich meine lokalen Änderungen verwerfen?

Gibt es eine SVN-Möglichkeit, dies zu tun? Wenn nicht, muss ich zu jeder Datei gehen und alle meine Änderungen löschen. Dann würde ich ein neues Diff generieren und es einreichen.

Vinayak Garg
quelle

Antworten:

253

Verwenden Sie einfach den svn revertBefehl, zum Beispiel:

svn revert some_file.php

Es ist (wie jeder andere svn-Befehl) in der svnbook-Ressource oder in der Manpage oder sogar mit dem svn helpBefehl gut dokumentiert .

Cédric Julien
quelle
2
Nur dass Vinayak seine lokalen uninteressanten Veränderungen für sich behalten möchte.
Basile Starynkevitch
2
@BasileStarynkevitch: Ich habe die Frage noch einmal gelesen und es sieht so aus, als wären die anderen Änderungen nicht erforderlich: "" "Die restlichen Änderungen, die ich vorgenommen habe, waren für das Debuggen im Grunde genommen und werden nicht mehr benötigt." ":)
Cédric Julien
1
Ja ... aber er könnte sie weiter für sich behalten wollen ... (Seine Frage könnte in beide Richtungen verstanden werden).
Basile Starynkevitch
193

Sie müssen alle Änderungen mit dem Befehl svn revert zurücksetzen :

  • Änderungen an einer Datei rückgängig machen: svn revert foo.c
  • Ein ganzes Verzeichnis von Dateien zurücksetzen: svn revert --recursive .
Alberto Spelta
quelle
1
Verweis auf SVN 1.1 ist ein wenig alt, obwohl es der erste Link von Google ist ;)
Cédric Julien
Anscheinend können einige Zeichen in Ihrem Dateinamen ignoriert werden. Zum Beispiel [email protected]. svn revert [email protected]. svn sagt "Symbol" übersprungen.
Topwik
1
Dies ist die beste Antwort. Es sollte überprüft werden.
Rickfoosusa
12
Das svn revert --recursive .hilft mir sehr .
Paul Vargas
Dies sollte die akzeptierte Antwort sein, da der --recursiveParameter alle lokalen Änderungen zurücksetzt und dies die Frage ist.
Arueckauer
15

So verwerfen Sie lokale Änderungen in einer bestimmten Datei:

$ svn revert example_directory/example_file.txt

So verwerfen Sie lokale Änderungen in einem bestimmten Ordner:

$ svn revert -R example_directory/
Batigolix
quelle
7

Einfach svn revertwar genug für das Originalplakat. Ein einfacherer svn revertFall reicht jedoch nicht für den allgemeineren Fall, in dem Sie sich befinden

  1. haben beide Änderungen , die Sie teilen möchten Änderungen , die Sie nicht teilen möchten in der gleichen Datei ,
  2. haben lokale Änderungen , dass Sie noch in Führung interessiert sind für Ihren eigenen privaten Nutzen .

@ ErichBSchulz 'Vorschlag zur Verwendung git add -pist sehr vernünftig und in einem solchen Fall viel allgemeiner anwendbar. Der Antwort fehlten nur einige Details. Angenommen, Ihr aktuelles Verzeichnis ist das Verzeichnis, in dem Sie den gemeinsam nutzbaren Patch erstellen möchten, können Sie Folgendes tun:

  1. Testen Sie die makellose Version von der Subversion in ein anderes Verzeichnis (wählen Sie einen nicht vorhandenen Verzeichnisnamen aus, hier über das Unterverzeichnis TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Initiieren Sie auf der Grundlage dieser unberührten SVN-Prüfung ein Git-Repository und ignorieren Sie die SVN-Verzeichnisse. Übertragen Sie alles in svn head in Ihr temporäres Git-Repository

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Kopieren Sie die neu vorbereiteten Git-Repository-Metadaten in Ihr ursprüngliches Arbeitsverzeichnis. Da das makellose Subversion-Checkout-Verzeichnis nicht benötigt wird, können Sie es entfernen. Ihr Arbeitsverzeichnis ist jetzt sowohl Git- als auch Subversion-Repository:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Sie können jetzt leistungsstark und bequem verwenden, git add -pum interaktiv genau das auszuwählen, was Sie freigeben möchten, und diese in Ihr Git-Repository zu übertragen. Wenn Sie dem Commit Dateien hinzufügen müssen, tun Sie dies auch git add <file-to-add>vorhergit commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. Bereiten Sie mit dem Commit einen Patch vor, den Sie freigeben möchten. Zu diesem Zweck können Sie auch Folgendes verwenden git diff HEAD^..HEAD: git format-patch(Letzteres kann verwendet werden, um E-Mails mit dem Patch oder mehreren Patches direkt vorzubereiten):

    $ git show -p HEAD > my-mighty-patch.patch
    

Um Git-Metadaten loszuwerden, tun Sie es einfach rm -rf .git/. Wenn Sie weiterhin mit dem ursprünglichen Arbeitsverzeichnis hacken möchten, können Sie weiterhin gitIhre lokalen Änderungen verwalten. In diesem Fall würden Sie wahrscheinlich von der Investition in das Erlernen der Verwendung profitieren git svn.

Hinweis: Wenn Sie damit vertraut sind, gitist es ziemlich trivial, zu improvisieren. Ansonsten sieht das vielleicht etwas chaotisch aus. Sie können den Ansatz verallgemeinern, indem Sie aus diesen Schritten ein Skript schreiben, um ein "interaktives Commit" oder eine "interaktive Patch-Erstellung" für svn zu implementieren, die ohne Verständnis von git verwendet werden können.

FooF
quelle
3
Vielen Dank für anonym -1 ohne Erklärungen. Auf jeden Fall habe ich mir Zeit genommen, um die Antwort zu verbessern, indem ich klarstellte, wann dieser Ansatz sinnvoll ist.
FooF
2
Vielen Dank für die Erweiterung. +1 von mir! Mach dir keine Sorgen. Harte Menge.
ErichBSchulz
1
Danke für die Daumen hoch, @ErichBSchulz! Langsam machen wir die Welt trotz der Gegner zu einem besseren Ort zum Leben !!! ;-)
FooF
4

Du könntest benutzen

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

Vergessen Sie beim Veröffentlichen Ihres Diff nicht, die Revision anzugeben, gegen die Sie sich unterscheiden.

Wie andere antworteten, könnten Sie auch svn revertvorsichtig verwenden. Es hängt davon ab, ob Sie Ihre lokalen Änderungen für Ihre zukünftige Arbeit behalten möchten oder nicht ...

Basile Starynkevitch
quelle
+1 Dies ist die beste Lösung für das Problem, aber in diesem Fall wollte ich wirklich alle meine Änderungen loswerden. Natürlich würde ich nicht revertständig meine Änderungen vornehmen wollen . Also würde ich deinen Weg in Zukunft benutzen.
Vinayak Garg
3

Gehen Sie zum Stammverzeichnis dieses Repositorys und führen Sie den folgenden Befehl aus

svn revert --depth=infinity .
Bunty
quelle
1
svn revert -R .könnte kürzer sein
jesjimher
1

Sie können den Befehl commit für die Datei verwenden, die Sie einfügen möchten, und den Befehl svn revert verwenden, um die verbleibenden lokalen Änderungen zu verwerfen

jlemos
quelle