Gibt es einen Subversion-Befehl zum Zurücksetzen der Arbeitskopie?

110

Gibt es einen einzelnen Subversion-Befehl, der eine Arbeitskopie genau auf den Status zurücksetzt, der im Repository gespeichert ist? So etwas wie git reset --hardoder (ha, Hard Git Reset entfernt auch nicht nicht versionierte Dateien!) rm -rf wc && svn co <url> wc.

Update: Ich bin nicht nach einem einfachen Zurücksetzen, da dadurch keine zusätzlichen Dateien in der Arbeitskopie gelöscht werden. Ich möchte wirklich etwas, das dem Löschen der Arbeitskopie und dem erneuten Auschecken entspricht, nur ohne dass die Daten erneut heruntergeladen werden müssen. (Natürlich macht es mir nichts aus, alle nicht festgeschriebenen Änderungen zu verlieren.)

Zoul
quelle
alle Änderungen in der Arbeitskopie zurücksetzen?
Mauris
5
Sie würden verwenden git clean -xdf, um Dinge zu entfernen, die nicht unter Quellcodeverwaltung stehen.
vcsjones
1
@vcsjones: Danke, die Manpage für git cleanZitate zitiert genau das, wonach ich suche: "Dies kann (möglicherweise in Verbindung mit dem Zurücksetzen von Git) verwendet werden, um ein makelloses Arbeitsverzeichnis zum Testen eines sauberen Builds zu erstellen." Schade, dass Subversion so etwas nicht eingebaut zu haben scheint.
Zoul

Antworten:

180

Sie können wie folgt rekursiv zurückkehren:

svn revert --recursive .

Es gibt keine Möglichkeit (ohne ein kreatives Skript zu schreiben), Dinge zu entfernen, die nicht der Quellcodeverwaltung unterliegen. Ich denke, das Beste, was Sie tun können, ist, alle Dateien zu durchlaufen, das Ergebnis von zu verwenden svn listund dann zu grepen. Wenn das grep fehlschlägt, löschen Sie es.

BEARBEITEN : Die Lösung für das Creative-Skript ist hier: Entfernen Sie nicht konvertierte Subversion-Dateien automatisch

Sie können also ein Skript erstellen, das eine revertmit der Antwort in der verknüpften Frage kombiniert , die am besten zu Ihnen passt.

vcsjones
quelle
3
Möglicherweise möchten Sie auch svn cleanupzuerst auf dem WC ausgeführt werden. Dies ist meine Standardpraxis zum Aufräumen nach abgebrochenen Zusammenführungen und so weiter.
Mike Miller
Schildkröte hat auch eine Option "nicht versionierte Dateien entfernen" im Bereinigungsdialog.
v.oddou
2
Es wäre schön, wenn die Option "Nicht konvertierte Dateien entfernen" über die Befehlszeile verfügbar wäre. Speziell für automatisierte Builds.
C. Tewalt
3
Siehe meine Antwort ... - Remove-Unversioned existiert für SVN-Bereinigung
Denny Weinberg
38

Verfolgte Dateien zurücksetzen

svn revert . -R

So bereinigen Sie nicht verfolgte Dateien

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Das -rfmag / sollte zuerst beängstigend aussehen, aber wenn man es einmal verstanden hat, wird es aus folgenden Gründen nicht mehr sein:

  1. Nur vollständig nicht verfolgte Verzeichnisse stimmen mit dem übergebenen Muster überein rm
  2. Das -rfist erforderlich, sonst werden diese Verzeichnisse nicht entfernt

Zurücksetzen dann reinigen (die OP-Frage)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Für gleichbleibende Benutzerfreundlichkeit

Fügen Sie Ihren .bash_aliases einen permanenten Alias ​​hinzu

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'
niklauzg
quelle
Das 2. Snippet scheint für mich nicht zu funktionieren:awk: fatal: error reading input file '-': Input/output error
hbogert
Ich musste dem ?im awkBefehl entkommen , sonst stimmte es mit allen Zeilen in der Ausgabe vonsvn status
gpanders
23

Löschen Sie alles in Ihrer lokalen Kopie mit:

rm -r your_local_svn_dir_path/*

Und das alles rekursiv mit dem folgenden Befehl zurücksetzen.

svn revert -R your_local_svn_dir_path

Dies ist viel schneller als das Löschen des gesamten Verzeichnisses und das anschließende Auschecken, da die Dateien aus Ihren lokalen SVN-Metadaten wiederhergestellt werden. Es braucht nicht einmal eine Netzwerkverbindung.

Vivek Yadav
quelle
4
viel schneller ist svn cleanup --remove-unversioned.
Znik
7
svn revert . -R

alles zurücksetzen.

svn revert path/to/file

für eine einzelne Datei

Abe Voelker
quelle
1
Dadurch werden keine zusätzlichen nicht versionierten Dateien in der Arbeitskopie gelöscht, oder?
Zoul
@zoul Ich glaube nicht, aber zitiere mich nicht dazu, da es eine Weile her ist, seit ich SVN
Abe Voelker
Leider werden nicht verfolgte Dateien nicht berührt. versuchen Sie svn revert -R your_local_svn_dir_path
Znik
7

Löschen Sie nicht versionierte Dateien und setzen Sie alle Änderungen zurück:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

Aus:

D         D:\tmp\sql\update\abc.txt
Denny Weinberg
quelle
1
Dies ist die beste Antwort ohne zusätzliches Scripting. Dies ist universell und kompatibel mit vielen SVN-Versionen.
Znik
3

Reine Windows cmd / bat Lösung:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof
Andriy F.
quelle
2

Das Löschen der Arbeitskopie vom Betriebssystem und das erneute Auschecken ist am einfachsten, aber offensichtlich kein einziger Befehl.


quelle
Schmerzlich langsam. Deshalb habe ich nach einem Weg gesucht, dies zu umgehen.
Zoul
1
+1, Dies ist oft die einzige Möglichkeit, seltsame Probleme zu beheben, zumindest die ich gefunden habe.
Brad
2

Sehr schnell und einfach und macht genau das, was Sie wollen

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

Die /(config|.ini)/ ist für meine eigenen Zwecke.

Und möglicherweise ist es eine gute Idee, dem Befehl svn --no-ignore hinzuzufügen

user1299374
quelle
2
Das ist so schrecklich. Was ist mit Windows-Benutzern? Subversion erfordert offensichtlich ein wenig Arbeit, bevor sie als Tool zur Versionskontrolle ernst genommen werden kann.
Warren P
1

So entfernen Sie nicht verfolgte Dateien

Ich konnte alle nicht verfolgten Dateien auflisten, die von svn stin bash gemeldet wurden, indem ich Folgendes tat:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Wenn Sie Glück fühlen, könnten Sie ersetzen echomit rmzu löschen untracked Dateien. Oder kopieren Sie die Dateien, die Sie löschen möchten, von Hand, wenn Sie weniger Glück haben.


(Ich habe die Antwort von @ abe-voelker verwendet, um die verbleibenden Dateien zurückzusetzen: https://stackoverflow.com/a/6204601/1695680 )

ThorSummoner
quelle