2009-04-20 8 views
20

Das ist vielleicht unmöglich, aber ich werde trotzdem fragen.Wie kann ich ein einzelnes SVN-Commit für mehrere externe Elemente an der Befehlszeile ausführen?

Ohne in die Einzelheiten zu gehen, warum es so ist, ich habe zwei primäre Kassen, die ich in Arbeit, eine für die Produktion Release-Zweig und einen für Stamm. Jede von ihnen ist eine kleine Sammlung von svn: externals Verweisen auf Unterprojekte, ohne direkten Inhalt unter dem ausgecheckten svn-Verzeichnis.

Das heißt, die vier svn: externals Richtlinien hinzufügen alle Inhalte in jeder der Kasse Verzeichnisse.

Wenn ich einen Commit über Eclipse (/ Subclipse) mache, kann ich Änderungen für alle externen Projekte auf einmal übernehmen, was gut ist, da es nur separate Unterprojekte im selben Repository sind Vermeiden Sie es, 4 separate Commits hintereinander zum selben Repo zu machen.

Ist es nicht möglich, die gleiche Sache, von der Kommandozeile zu tun? Commits für jedes der Externals könnten natürlich mit Skripts und Aliasing für einen Befehl versehen werden, aber ich würde es lieber vermeiden, das Commit-Protokoll mit separaten Commits für verwandte Änderungen zu überfluten, wenn möglich.

Antwort

7

Leider war Ihre Annahme richtig. Das aktuelle Subversion-Befehlszeilentool wird während eines Commits nicht in unzusammenhängende externe Arbeitskopien recursen. Eclipse findet wahrscheinlich heraus, dass alles gleich verwurzelt ist und passt alles so an, dass es nur eine einzige Commit-Transaktion durchführt.

Dieser Nachteil des Kunden wird als eines der Themen achten tatsächlich aufgeführt, wenn Äußerlichkeiten in Ihrem Projekt zu definieren. Ab dem 1.6.1-Client besteht diese Einschränkung weiterhin.

9

Sie können alle Dateien und Ordner geben Sie in der Befehlszeilen-Client verpflichten wollen, die Externen einschließlich. Da die CL Rekursion nicht in Äußerlichkeiten, müssen Sie separat die in Ihrem Commit-Befehl angeben:

svn ci working_copy externals1 externals2 -m "log message" 

das nicht obwohl versucht. Wenn es nicht funktioniert, müssen Sie alle geänderten Dateien und Ordner separat angeben, nicht nur die Root-Ordner der externen Dateien.

+0

Leider kann ich nicht Testen Sie dies in meinem bestehenden Setup als zwei der externen fälschen ein gemeinsames Elternverzeichnis, so bekomme ich einen Fehler, der besagt, dass kein Arbeitsverzeichnis (weil es nicht ist) beim Versuch, Ihre Lösung als: Svn ci htdocs/intra htdocs/Update-Skripte enthält -m "msg" –

+0

... und es gibt keine Änderungen in Skripten und Includes zu committen. –

+8

Ich weiß, das ist zu diesem Zeitpunkt älter als Dreck, aber das obige funktioniert nicht für relative externe Pfade (Externe, die zum selben Repository gehören. Sie erhalten "Sind alle Ziele Teil der gleichen Arbeitskopie? Kann nicht sperren {externalPath } ".Es funktioniert jedoch, wenn Sie vollständige Dateipfade für jede Datei erstellen. – MightyE

-2

Sie tun können:

svn ci -m"my comment" * 
+0

Bitte erweitern Sie Ihre Antwort und erklären Sie, warum dieser Befehl die Aufgabe erfüllt – WebChemist

1

Wenn Sie nur Inhalte und keine Attribute Änderungen haben, können Sie etwas zusammen tun können:

svn st | egrep "^M" | awk '{print $2}' | xargs svn ci -m 'your message' 

Wenn Sie hinzugefügt/gelöscht haben, ... Dateien, Sie können die Regex an Ihre Bedürfnisse anpassen.

0

ich iterieren alle Äußerlichkeiten über, und führen Sie "svn commit" auf jeden, wie zum Beispiel:

for dir in $(svn propget svn:externals . | awk '{print $2}'); do svn commit $dir; done 
2

Mit der neuesten SVN Sie tun können: --include-externals

Verwandte Themen