2009-10-27 6 views
32

Meine Situation ist, dass eine Reihe von Dateien in svn eingecheckt sind, die sehr ärgerlich sind, um unter Versionskontrolle zu haben (speziell eine log4j.properties Datei), und ich möchte sie aus der Versionskontrolle entfernen. Ich weiß bereits, wie man eine Datei von SVN Versionskontrolle in meiner eigenen lokalen Arbeitskopie entfernt, wie in this question und this one, aber das ist nicht genau das, was ich suche.Wie entferne ich eine Datei aus der SVN-Version, ohne sie aus jeder Arbeitskopie zu löschen?

Das Problem ist, dass, sobald ich die Datei mit svn rm --keep-local entfernen, wenn jeder andere Benutzer aus dem Repository zieht ihre lokalen Kopien von log4j.properties verschwinden und ihre Umgebungen werden abstürzen. Was ich tun möchte, ist die Datei aus der Versionskontrolle im Repository zu entfernen, aber auch so, dass, wenn alle anderen aus dem Repository zieht es ist, als ob sie --keep-local auf ihren eigenen Maschinen verwendet hätten, so dass die vorhandene Kopie ihrer log4j.properties Datei bleibt herum, wird aber nicht versioniert.

Ist dies überhaupt möglich zu machen? Ich vermute, dass es ein Feature ist, das SVN einfach nicht hat.

+1

Dies tun speichern ist ein Widerspruch. Wenn eine Datei ein erforderlicher Teil des Projekts ist - wenn dies nicht der Fall ist, warum würde das Entfernen der Datei dazu führen, dass jemand die Umgebung zum Absturz bringt? - Es gehört in die Quellcodeverwaltung. –

+2

Es ist nicht, dass die Datei nicht erforderlich ist, ist es eher ein Einsatz Artefakt, das das gleiches nicht von einem Benutzer zum nächsten sein wird - zum Beispiel, eine der Dateien enthält ein Bündel von Pfadnamen auf Verzeichnisse. Wir haben bereits Beispieldateien wie in Don Kirkbys Antwort unten. –

Antwort

8

Wenn Sie wirklich viele solcher Dateien haben, können Sie zwei Fliegen mit einer Klappe schlagen, indem Sie eine svndumpfilter Operation verwenden. Die Idee besteht darin, ein Depot des Repositorys auf dem Server zu erstellen, Dateien herauszufiltern, die Sie nicht behalten möchten, und das Ergebnis in ein neues Repository zu laden. Dann legst du das neue anstelle des alten ein.

Dies muss mit Vorsicht geschehen, wenn Benutzer nicht offensichtlich auf das Repository zugreifen. Aber es wird tatsächlich die Dateien entfernen (interessant, wenn sie groß sind), anstatt sie in der Geschichte zu behalten. Als Nebeneffekt werden diese Dateien bei der nächsten Aktualisierung durch einen Benutzer ignoriert, als ob sie sich nie im Repository befänden. Wir mussten das ein paar Mal machen, um Binärdateien zu entfernen, die dort nicht ihren Platz hatten.

Link to the related documentation.

Einfaches Beispiel (der Befehl bietet mehr Flexibilität natürlich):

svnadmin create repos_new 
svnadmin dump repos | svndumpfilter exclude trunk/log4j.properties | svnadmin load repos_new 

Da es in das Repository auf dem Server berührt, möchte ich noch einmal betonen, dass Sie Vorsichtsmaßnahmen treffen sollten (halten Sie Ihre alte Repository). Für nicht so störende Dateien ist das von Don vorgeschlagene Verfahren weniger drastisch und vorzuziehen.

Um diese Art von Situation zu vermeiden, können Sie die entsprechenden svn:ignore Eigenschaften in den Verzeichnissen festlegen, Sie können auch Leute dazu ermutigen, globale Ignores zu verwenden (sie müssen leider auf jedem Client gesetzt werden) oder sogar die Hook-Skripte verwenden präventiv Kategorien von Dateien verweigern.

+1

Gute Soße. Das scheint eine Menge Arbeit zu sein und gefährlich zu booten (abgesehen davon habe ich keinen Shell-Zugriff auf das Repository). Aber es scheint wie eine Lösung. –

+1

Die Menge der Arbeit sagt hauptsächlich, welche Dateien ausgeschlossen werden, Sie können das in mehreren Schritten tun, wie in dem Link besser erklärt. Eine gute Nachricht ist, dass Sie das Original-Repository nicht wirklich anfassen werden. Im schlimmsten Fall müssen Sie das neue Repository einfach neu erstellen. Verschiebe das Original woanders hin, benenne das neue als Original um, vergewissere dich, dass alles in Ordnung ist und du fertig bist :-) – RedGlyph

7

Was ich in der Regel in ähnlichen Situationen zu tun ist, um die Repository-Kopie von log4j.properties zu log4j.properties.template oder log4j.properties.default umbenennen, und ich füge hinzu log4j.properties auf die svn:ignore Liste. Dann muss jeder Benutzer diese Datei in ihrer Arbeitskopie nach log4j.properties kopieren. Um es ein wenig freundlicher zu machen, können Sie Ihr Build-Skript einchecken, das eine Erinnerungsnachricht ausgibt, wenn es die lokale Kopie nicht findet.

+0

Wir haben tatsächlich etwas sehr ähnliches für viele dieser Dateien, und ein Teil der Entwicklung einer neuen Umgebung beinhaltet das Kopieren dieser Dateien. Aber ich möchte nicht, dass jeder die Dateien, die ich von svn entferne, kopiert. –

+2

@Tim: Manchmal erfordert das Wachsen etwas Schmerz. – NotMe

+1

jedoch die Build-Skript Idee ist faszinierend - ich nehme an, ich ein Skript schreiben könnte, die automatisch die Beispieldateien über die tatsächlichen diejenigen kopiert, wenn sie nicht vorhanden ist, und dann nur für ihn gehen und nuked die vorhandenen Kopien aus dem Repository. Aber das ist eine andere Frage ... –

14

Das Geheimnis ist, um sicherzustellen, dass es auf der Ignorierliste vor Sie das Löschen zu begehen. Wenn Sie dies in dieser Reihenfolge tun, wird das Löschen nicht an die Arbeitskopien anderer Personen weitergegeben.

Wir verwenden immer noch svn 1.4, so dass die Option --keep-local nicht verfügbar ist. Aber Sie können dasselbe erreichen, indem Sie es mit einem Serverpfad und einer -m-Commit-Nachricht löschen.

Also in meinem Beispiel habe ich versehentlich ein Verzeichnis namens Nbproject festgeschrieben. Das ist die Einstellung des Entwicklerprojekts für die von uns verwendete IDE (NetBeans). Ich wollte das nicht von allen Arbeitskopien löschen oder sie würden alle ihre Einstellungen verlieren! Aber das hat den Trick gemacht. Ausgehend von dem übergeordneten Verzeichnis:

$ cd trunk 
$ svn propedit svn:ignore . 

bringt $ EDITOR

hinzufügen Verzeichnis nbproject in einer eigenen Zeile und

$ svn commit -m 'Ignore nbproject' 
$ svn rm https://.../trunk/nbproject -m 'Remove nbproject from svn' 
+3

Eigentlich funktioniert das nicht. Der Löschvorgang wird weiterhin durchgeführt. :( –

+1

vielleicht Leute müssen nur Einstellungen vor allem anderen zu ignorieren? – tgkprog

-2
svn delete --keep-local <PATH> 

wird

+4

Haben Sie die Frage nicht verstanden? Es fragt, ob es eine Alternative zu 'svn delete --keep-local' gibt, die die Dateien aus den Arbeitsverzeichnissen der Leute nicht löschen wird Entfernen Sie sie einfach aus der Versionskontrolle, so dass 'svn delete --keep-local' nicht funktioniert. –

Verwandte Themen