Wie entferne ich eine Datei aus der Versionskontrolle, ohne sie zu löschen?

Antworten:

277

Sie möchten die --keep-localBefehlszeilenoption. Dadurch wird die Datei aus der Versionskontrolle entfernt, ohne sie aus Ihrem Dateisystem zu entfernen.

$ svn rm --keep-local my_important_file

Hinweis: Die --keep-localnur die Auswirkungen svn rmIhrer Kopie. Bei anderen Benutzern wird möglicherweise eine eigene lokale Kopie der Datei gelöscht, es sei denn, aufgrund der von ihnen vorgenommenen Änderungen besteht ein Konflikt zwischen ihrer lokalen Kopie und dem Repository. Dies ist möglicherweise nicht das gewünschte Ergebnis. Siehe Kommentare unten.

Andres Jaan Tack
quelle
4
Wird das nicht immer noch von den Systemen anderer Leute gelöscht, wenn diese aktualisiert werden?
Nyerguds
1
@Nyerguds Das ist richtig, da der svn rm die Dateien aus dem Repository entfernt. Wenn Sie Dateien aus dem Repo entfernen möchten, behalten Sie sie jedoch lokal auf Ihrem Computer, und verwenden Sie dann das obige Flag.
Greg Hilston
6
@ GregHilston Wie gesagt, das hilft bei tatsächlichen Projekten mit mehreren Programmierern nicht wirklich. Es sollte eine Möglichkeit geben, die Datei überall einfach zu deversionieren. Der häufigste Fall sind lokale Einstellungsdateien, die versehentlich festgeschrieben wurden (sehr häufig in Java-Projekten). Wenn Sie sie jedoch nicht konvertieren, sollten Sie die Einstellungsdateien anderer Benutzer nicht löschen.
Nyerguds
5
@ GregHilston "tatsächliche Projekte mit mehreren Programmierern" war eher in "Systemen anderer Leute" enthalten. Das Problem ist folgendes: Andere Leute aktualisieren und lassen ihre Einstellungen überschreiben. Dies ist normalerweise nicht zu problematisch, aber ärgerlich genug, um es lösen zu wollen. Zu diesem Zeitpunkt, wenn sie die Einstellungen bereits überschrieben haben und jetzt beim Aktualisieren ein svn "rm" erhalten, wird die potenziell wichtige lokale Einstellungsdatei tatsächlich von ihrem System entfernt, während sie nur nicht konvertiert werden sollte, damit sie auf lokal konfiguriert werden kann Einstellungen erneut.
Nyerguds
4
Durch das erneute Laden einer älteren Datei aus dem Repository wird diese als aus dieser älteren Version stammend markiert. Dies bedeutet, dass ein Update sie einfach erneut löscht. Es gibt keinen sauberen Weg, der manuelle Eingriffe auf allen Maschinen im Projekt erfordert.
Nyerguds
13

Das Entfernen einer Datei aus SVN, ohne sie lokal zu löschen, ist ein häufiges Problem. Ein prominentes Beispiel ist die Datei .classpath in einem Eclipse-Projekt. Das Einfügen dieser Konfigurationsdatei unter SVN ist wunderbar, solange alle im Projekt verwendeten Computer dieselbe Eclipse- und Java-Installation haben. Sobald diese Bedingung verletzt ist, beginnen Commits, andere Eclipse-Projekte zu brechen. Dies ist der Punkt, an dem man eine Datei aus SVN entfernen muss, ohne sie irgendwo zu löschen.

svn rm --keep-local .classpath

erledigt die Arbeit perfekt auf einer Maschine und zu diesem Zeitpunkt.

Das Problem ist, dass andere Computer diese Datei möglicherweise verlieren (beim Update) oder sie wiederbeleben (beim Festschreiben). Der Fehler von SVN besteht weder darin, --keep-localdas Repository zu behandeln noch es auf andere Arbeitskopien zu übertragen. Daher muss auf allen anderen oben genannten Computern der Befehl ausgeführt werden - am besten vor jedem Festschreiben oder Aktualisieren.

Dies funktioniert natürlich bestenfalls zu 90%. Löschungen und Neuversionen erfolgen plötzlich. Meine Lösung besteht darin, jede Maschine, auf die ich direkten oder indirekten Zugriff habe, zu tun

svn rm --keep-local .classpath
copy .classpath .classpath-nameOfTheMachine
svn add .classpath-nameOfTheMachine

Dies ist so geradezu hässlich, dass man es kaum als "Lösung" bezeichnen kann. Trotzdem ermöglichte es immer eine schnelle Reparatur späterer Unfälle.

Albrecht Weinert
quelle
-3

Ich habe keine Antwort auf diese genaue Frage, aber ich habe eine Antwort auf eine verwandte Frage, bei der alle Dateien (dh keine bestimmte) in einem Verzeichnis aus der Versionskontrolle entfernt werden, ohne sie lokal zu löschen. Diese Lösung stammt aus einer Scientific Linux-Implementierung.

ls -a .svn

sollte das svn-Verzeichnis anzeigen, in dem Steuerdaten gespeichert sind. Einfach:

rm -r .svn

wird dieses Verzeichnis loswerden. Dann tippe:

svn status

Es wird der Fehler "Warnung: Dieses Verzeichnis ist keine Arbeitskopie" ausgegeben, da es nicht mehr unter Versionskontrolle steht.

Ich hoffe das hilft.

cjames
quelle
Eine verwandte Frage? Das Entfernen einer Datei und das Entfernen der gesamten Arbeitskopie sind meiner Meinung nach völlig andere Dinge.
Melebius