2008-10-10 12 views
9

Ich habe ein selbst entwickeltes automatisiertes Build-Skript in Form einer DOS-Batch-Datei. In einem Teil dieses Skripts schaue ich mir (mit "svn checkout") einen Abschnitt unseres SVN-Repositories an, der eine Menge von Drittanbieter-Sachen enthält, die in unseren Projekten verwendet werden. Diese Batch-Datei hat sich lange gut bewährt, aber jetzt haben die Leute viel Fluff (Dokumente, Beispielcode, etc.) in den Third-Party-Bereich eingecheckt und der Checkout-Teil dieses Skripts ist viel langsamer geworden. Ich möchte das mildern, indem ich nur die Sachen auschecke, die wir brauchen - meistens DLL-Dateien in unserem Fall. Meine Frage lautet also: Was ist der beste Weg, um ein SVN-Repository zu überprüfen, das nach der Dateierweiterung gefiltert ist?SVN Checkout nach Dateiendung gefiltert?

Ich sah keinen offensichtlichen Weg, dies in der Svn Hilfe zu tun. Ich habe eine .NET-Utility-Bibliothek, die svn.exe in gewisser Weise umschließt, und ich dachte darüber nach, dies zu erweitern, um nur Inhalte abzurufen, die meinen Erweiterungen entsprechen. Aber ich würde es vorziehen, eine einfachere oder existierende Methode zu verwenden, wenn eine existiert.

+0

Dies ist zu lokalisiert. Die Frage bezieht sich auf Drittanbieter svn fügt – AlxVallejo

+0

@AlxVallejo Nein, ist es nicht. Es bezieht sich auf svn.exe. –

Antwort

21

Dies ist möglich: Sie können svn checkout ein leeres Verzeichnis, und dann svn update filename für jede Datei, die Sie wollen tun.

Ihr Skript kann wie etwas tun:

  1. svn checkout svn://path/to/repos/directory --depth empty
  2. svn list --recursive svn://path/to/repos/directory
  3. Rohr, das durch einen Filter zur Folge haben, dass die verbotenen Dateierweiterungen entfernt, z.B. grep
  4. Iterate über diese neue gefilterte Liste und svn update --parents jede Datei

die das gewünschte Ergebnis einer Arbeitskopie ohne bestimmte Dateien oder Dateierweiterungen geben würde.

Natürlich gibt es auch das Problem, dass Sie von "Menschen [überprüfen] in vielen Flaum" erwähnen, aber das ist eine separate Angelegenheit.

+1

Sie können auch die Subversion-Unterstützung von ant ansehen: http://subclipse.tigris.org/svnant/svn.html – tonyo

+1

Wie sieht eine Implementierung aus? – Pup

+2

Ich habe versucht, diesen Ansatz selbst zu implementieren, aber ich denke, ich mache es falsch. Ich bekomme übersprungene Pfadkonflikte. – aaaantoine

0

Sie können nicht nur ein paar bestimmte Dateien auschecken - Sie können nur einen ganzen Ordner auschecken. Sie können die Organisation des ausgecheckten Objekts neu anordnen, oder Sie können einfach eine Arbeitskopie von woanders kopieren und aktualisieren.

3

Wie ich here gesagt, gibt es nur eine Option baut in SVN selbst: Ein neues Feature in SVN 1.5 genannt spärliche Kasse, jedoch können Sie nur Kasse auf Verzeichnisebene, so dass Sie die Dateien sortieren, müssen Sie tun brauche ich nicht in einem anderen Verzeichnis.

+2

Danke, dass Sie auf Sparse Directories hingewiesen haben - sie sind wirklich mächtige Funktion. Für alle Interessierten http://bit.ly/99Nblk ist das entsprechende Kapitel aus svn-book. –

+0

Also mit anderen Worten, nein, es gibt keine Möglichkeit, einen Svn-Checkout durch Erweiterung zu filtern. – AlxVallejo

-3

Der einfachste und korrekte Weg, dies zu tun: TUN SIE ES NICHT!

Wenn es irgendeinen Mist im Third-Party-Ordner gibt, in dem es DLL-Dateien gibt, die geprüft werden müssen, entfernen Sie diesen Mist an einen anderen Ort! Es gehört sowieso nicht hierher.

0

Für eine Powershell-spezifische Implementierung der Antwort von Michael Hackner, versuchen Sie so etwas wie:

svn ls http://svn-server/src --recursive | Out-File svn.txt 
Get-Content .\svn.txt | where {$_.toLower().EndsWith('special.xml')} | select -First 200 | foreach {New-Object PSObject -Property @{ Path = $_; Munged = $_.Replace('/', '_') } } | foreach { svn export "http://svn-server/src/$($_.Path)" $($_.Munged) } 

Mein besonderer Anwendungsfall ist hier eine Reihe von Dateien mit ähnlichen Namen (in diesem Fall * special.xml) zu finden und Dumping sie alle in einem einzigen Ordner mit im Wesentlichen eindeutigen Namen. Ich habe eine Zwischendatei verwendet, um den gesamten Repo-Eintrag zu speichern, aber das könnte alles inline sein, auch wenn das für Sie besser ist.

0

Ich habe gerade den Ansatz von Michael Hackner versucht. Unten ist die Implementierung für ein DOS-System. Beachten Sie, dass Sie vor dem Ausführen dieses Skripts den leeren Ordner auschecken müssen.

@echo off 

svn list --recursive https://path_to_repository_folder | find /I ".sql" > filelist.txt 

REM Specify a custom delim. Otherwise space in filename will be treated as a delimiter. 
FOR /F "delims=|" %%i IN (filelist.txt) DO (
    echo ------------- 
    echo %%i 
    svn update --parents "%%i" 
) 
Verwandte Themen