2009-09-23 8 views
6

Ich habe eine große Anwendung in einer Produktionsumgebung, die ich unter Versionskontrolle verschieben möchte. Also habe ich ein neues Repo erstellt und die App importiert, abzüglich verschiedener Verzeichnisse und Dateien, die nicht der Versionskontrolle unterliegen sollten. Jetzt muss ich die installierte Kopie auschecken (aber die zusätzlichen Dateien behalten). Zu diesem Zeitpunkt, in einer aktuellen Version von SVN, würde ich einfach einen Checkout über das vorhandene Verzeichnis mit der Option --force durchführen. Aber leider habe ich eine alte Version von SVN, von früher, als die Option --force hinzugefügt wurde (und noch nicht aktualisieren kann ... lange Geschichte).Kopieren der .svn-Verzeichnisse von einer Kasse zu einer Nicht-Kasse, um es zur Kasse zu machen

Also habe ich die App in ein anderes Verzeichnis ausgecheckt und möchte einfach alle .svn-Verzeichnisse in das ursprüngliche Verzeichnis kopieren, wodurch das Original in eine Kasse verwandelt wird, während die zusätzlichen Dateien allein gelassen werden. Nun, vielleicht habe ich nur einen harten Tag und verpasse etwas, das auf der normalen Seite ist, aber ich scheine das nicht herausfinden zu können. Hier sind die Ansätze, die ich habe versucht, so weit:

  1. Verwendung rsync: Ich kann nicht scheinen, um die richtige Kombination von Einschluss- und Ausschluss Richtlinien zu treffen rekursiv die .svn Verzeichnisse alle zu erfassen, aber sonst nichts.

  2. Verwenden Sie cp: Ich kann nicht einen guten Weg, um es alle .svn Verzeichnisse quer durch und durch die ganze App zu treffen.

  3. Verwendung find mit -exec cp: Ich habe Probleme mit dem führenden Teil der Pfadnamen der gefundenen Dateien, die die Zielpfade durcheinander bringen. Ich kann es mit -printf '% P' ausschließen, aber das scheint nicht in den {} Ersatz für exec zu gehen.

  4. Verwendung finden mit XARGs zu cp: Ich habe Probleme mit dem Senden über Unterverzeichnisse vor dem Senden ihrer Eltern zu finden. Leider hat find keine Option --breathth.

Irgendwelche Gedanken da draußen?

Weitere Informationen:

  • bash 3.0.0.14
  • rsync 2.6.3 p28
  • cp 5.2.1
  • SVN 1.3.2
+0

Stellen Sie sicher, dass Sie daran denken, die Berechtigungen für die .SVN-Ordner ordnungsgemäß festzulegen, andernfalls kann es ein potenzieller Sicherheitsausschluss sein. Diese Website erklärt das Problem http://www.adamgotterer.com/2009/01/26/hacking-the-svn-directory/ – Joshua

Antwort

6

Verwenden Sie tar und finden Sie, um die .svn-Verzeichnisse in einem sauberen Checkout zu erfassen und dann in Ihre App zu entpacken.

cd /tmp/ 
svn co XXX 
cd XXX 
find . -name .svn -print0 | tar cf /tmp/XXX.tar --null -T - 
cd /to/your/app/ 
tar xf /tmp/XXX.tar 

Edit: Switched Find/Tar-Befehl, um NUL-Terminator für die Robustheit angesichts der Dateinamen mit Leerzeichen zu verwenden. Ursprünglicher Befehl war:

tar cf /tmp/XXX.tar $(find . -name .svn) 
+0

Wow, ich war mir der $ (...) Syntax nicht bewusst - ich nehme an, das ist eine Bash-Funktion. Dies scheint zu funktionieren, abgesehen von einem Problem: Es fehlschlägt Dateien/Verzeichnisse, die der Shell als mehrere Token erscheinen (z. B. solche mit Leerzeichen im Namen). Wie kann ich den Befehl tar ... find ändern, um mit diesen Namen umzugehen? Dateiname Beispiel: "6 - die foo" Ausgang: $ tar -cf ~/testsvn.tar \ '$ (Finden Sie -name .svn.) \' tar:‘./6: Can not stat : Keine solche Datei oder Verzeichnis tar: -: Kann nicht stat: Keine solche Datei oder Verzeichnis tar: das: Kann nicht stat: Keine solche Datei oder Verzeichnis tar: foo: Kann nicht stat: Keine solche Datei oder Verzeichnis –

+0

Sorry für das Chaos eines Kommentars - kann nicht herausfinden, wie Zeilenumbrüche in Kommentaren erzwungen werden. –

+0

Ja, $ (...) ist eine Bash-Funktion. Leerzeichen in Dateinamen sind yucky. Wahrscheinlich möchten Sie stattdessen etwas wie "suchen. -name .svn -print0 | tar cf /tmp/XXX.tar -T - --null" verwenden. Der Parameter -print0 teilt Find mit, dass anstelle von Newline NUL-Trennzeichen verwendet werden. Das -T- weist tar an, Dateinamen von stdin zu lesen, und --null weist tar an, NUL-Trennzeichen anstelle von Zeilenvorschüben zu verwenden. – bstpierre

0

(5) Kann‘ t Sie führen gerade einen Checkout in ein anderes Verzeichnis durch, kopieren dann die zusätzlichen Dateien in dieses Verzeichnis und vergewissern sich, dass alles in Ordnung ist, bevor Sie zum Ausführen der App aus dem neuen Verzeichnis wechseln.

+0

Leider ist dies nicht wirklich eine gute Option, weil die Liste der zusätzlichen Dateien als ständig ändert Die App wird ausgeführt. –