2012-04-12 4 views
2

Ich habe eine Verzeichnisstruktur, die eine Reihe von Konfigurationsdateien für eine Anwendung enthält. Die Struktur wird in Subversion gepflegt, und dann haben einige Systeme diese Verzeichnisstruktur ausgecheckt. Entwickler nehmen Änderungen an der Struktur im Repository vor, und ein Skript auf den Servern führt regelmäßig ein "svn update" durch.Wie erzwinge ich ein Verzeichnis, um genau mit dem Subversion-Server zu synchronisieren

Manchmal haben wir jedoch Leute, die unbeabsichtigt ein .svn-Verzeichnis unter einem der Verzeichnisse entfernen, oder eine Datei anheften, die nicht dazugehört. Ich tue, was ich kann, um die Hände des Verfahrens untreu zu schneiden, aber ich würde immer noch lieber für mein Update-Skript, um in der Lage zu sein, diese Änderungen (gut, automatisch) zu behandeln.

Also, was ich brauche, ist eine Möglichkeit, Dateien zu löschen, die nicht in Subversion sind, und eine Möglichkeit, in einem lokalen Verzeichnis zu stampfen, die auf dem Weg von etwas im Repository ist. So, wie Warnungen

Fetching external item into '/path/to/a/dir' 
svn: warning: '/path/to/a/dir' is not a working copy 

und

Fetching external item into '/path/to/another/dir' 
svn: warning: Failed to add directory '/path/to/another/dir': an unversioned directory of the same name already exists 

automatisch aufgelöst werden.

Ich bin besorgt, dass ich entweder die SVN-Statusausgabe in einem Skript analysieren muss, oder die SVN C-API verwenden und mein eigenes "Bereinigungs" -Programm schreiben, damit dies funktioniert (und ja, es muss funktionieren auf diese Weise; rsync/tar + scp und was auch immer noch keine Optionen für eine Vielzahl von Gründen sind). Aber wenn jemand eine Lösung (oder Teillösung) hat, die sich um das Problem kümmert, würde ich mich freuen, davon zu hören. :)

Antwort

0

schrieb ich ein Perl-Skript zum ersten Lauf svn cleanup alle Sperren zu handhaben, und dann die --xml Ausgabe von svn status zu analysieren, alles zu entfernen, die einen schlechten Status hat (mit Ausnahme von Äußerlichkeiten, die etwas komplizierter)

Dann sind fand ich dies: http://svn.apache.org/repos/asf/subversion/trunk/contrib/client-side/svn-clean Auch wenn dies alles nicht tun, was ich will, werde ich wahrscheinlich den größten Teil meines Codes verwerfen und verbessern ihn nur ein wenig . Mein XML-Parsing ist nicht so schön, wie es sein könnte, und ich bin mir sicher, dass dies etwas schneller ist als das Starten eines Systembefehls (was bei einem sehr großen Repository und einem Befehl, der alle fünf Minuten ausgeführt wird, von Bedeutung ist).

Ich fand schließlich das Skript in der Antwort auf diese Frage - Automatically remove Subversion unversioned files - versteckt unter allen Vorschlägen, Tortoise SVN zu verwenden.

+0

... und nach einer Weile, was ich getan habe, war ein Python-Skript schreiben mit der Svn-API direkt (nicht Pysvn) zu duplizieren Änderungen in einem Dateisystem auf der Grundlage der Post-Commit und Post-Revprop-Change-Hooks im Repo. Im Moment habe ich einfach einen geplanten Export alle 6 Stunden nicht autorisierte Änderungen zu handhaben, aber ich schreibe einen Dateisystem-Monitor (inotify über pyinotify), um alle nicht-Haken-generierte Änderungen am Dateisystem zu fangen. Jede andere erkannte Dateisystemänderung erzeugt eine Warnung und ersetzt, was auch immer geändert wurde, mit einer Kopie von svn. Details schließlich bei http://blog.dannysauer.com/?tag=subversion – dannysauer

0

Wie wäre es

rm -rf $project 
svn checkout svn+ssh://server/usr/local/svn/repos/$project 
+0

Ich habe auch 'svn update --accept theirs-full project' verwendet, aber es setzt das Vorhandensein eines vernünftigen' .svn' -Verzeichnisses voraus, und ich weiß nicht, ob es nicht verfolgte Dateien löscht. – ikegami

+0

Während das Entfernen technisch funktioniert, fehlt ihm eine gewisse Eleganz. :) Das Hauptproblem dabei ist, dass es in dieser Situation ist, dass es eine Weile dauert, das Verzeichnis wieder zu überprüfen (es enthält ungefähr 110K Dateien). Ich würde mir wünschen, dass diese Lösung so zielgerichtet ist, dass sie nur das reparieren kann, was kaputt ist, um die Verwendung von nicht * kaputten Teilen des Repositories nicht zu beeinträchtigen. – dannysauer

+0

Eigentlich ist es sehr elegant, da es gebrochene '.svn'-Verzeichnisse in einer klaren Codezeile behandelt. Die Alternative wäre eine heiße Sauerei. Wie kann man das '.svn' Verzeichnis validieren? – ikegami

Verwandte Themen