Wie können nur die Dateien, die in einem Bereich von SVN Revisionen geändert wurden überprüft werden?

StackOverflow https://stackoverflow.com/questions/320693

  •  11-07-2019
  •  | 
  •  

Frage

Ist es möglich, nur die Dateien aus einer SVN-Repository zur Kasse, die in einer Revision oder Revisionsbereich geändert wurde, ohne Dateien auschecken, die nicht geändert wurden?

War es hilfreich?

Lösung

Mein Vorschlag ist, in der gleichen Richtung wie flolo vermuten läßt. Aber nimmt eine Reihe. Sie könnten die folgende Shell-Funktion.

function checkout_files_in_revrange()
{
  svn_url=$1;
  start_rev=$2;
  end_rev=$3;
  for theCheckoutCanditate in `svn log -r $start_rev:$end_rev --verbose --incremental | grep "   M " | cut -f5 -d' ' | cut -f3- -d/`
  do
     svn co $svn_url/$theCheckoutCandidate -q;
  done
}

Andere Tipps

Es gibt afaik jetzt direkte Art und Weise nur die geänderten Dateien zu erhalten und nicht alle.

Meine Idee wäre: Verwenden Sie die ausführliche Ausgabe der Liste (die die letzte geänderte Version zeigt), filtern sie durch awk, und den Rest der Kasse. Z.B. um die Dateien zu suchen, die 42 in der Version änderte sich dies würde ich verwenden

VERSION=42
svn list -v -R -r $VERSION svn://... |  awk "/^[ ]*$VERSION/ {print \$7}" > files_to_checkout

Und später eine svn update -r $VERSION 'cat files_to_checkout' tun (oder eine Co auf die URL, je nachdem, wo Sie den Befehl ausgeführt werden soll).

EDIT: Zusätzliche noch kürzer: verwenden, um den Svn diff Befehl, und ersetzt mit -X und --diff-cmd den diff-Befehls mit Svn co. Dies erfordert einige Argument Verschiebung Hacking (was ich werde nicht hier erarbeiten), benötigt aber nur eine Zeile und keine Intermedate Datei (die Sie oben retten könnte, aber das würde Kosten der Lesbarkeit haben)

Wenn Sie svn log mit der -v (verbose Option) verwenden:

svn log -r <revision> -v <path>

Sie erhalten eine Ausgabe erhalten, die die geänderten Dateien enthält:

 r3 | ciaran | 2008-11-16 12:24:30 +0000 (Sun, 16 Nov 2008) | 1 line
Changed paths:
   A /trunk/apache/apache.conf
   A /trunk/application/controllers

Commit message goes here

Sie sollten in der Lage sein, das zu manipulieren mit einigem Grepping usw. eine Folge von svn co-Befehlen zu erzeugen.

Wir tun dies in einem MSBuild-Skript:

Schritt 1: - die diff Befehl wird die Liste der geänderten Dateien zu erhalten, umleiten Ausgabe in eine temporäre Datei im Zielverzeichnis Schritt 2: - Lesen Sie die temporäre Datei in eine ItemGroup

<Exec command="$(svnExecutable) diff -r $(StartRevision):$(EndRevision) $(DOUBLE_QUOTES)$(SvnRepositoryPath)/$(DOUBLE_QUOTES) --no-diff-deleted --summarize &gt; $(TempFilePath)" WorkingDirectory="$(WorkDirectory)" />

                     

Ich bin nicht völlig sicher, ob dies möglich ist, aber Sie können auch etwas tun:

svn checkout --revision <revisionNumber> 

eine gewisse Revision zu erhalten und

svn log --revision <revisionNumber> 

alle Dateien auflisten in einer Revision chaned

In fast der gleichen Linie wie die meisten der Leute vorgeschlagen haben, (aber nur in einem System mit grep und awk), können Sie die Liste erhalten, indem die Ausführung

svn log -v --revision <revision_number> | grep "^ " | awk '{print $2}'.

Ein weiteres nehmen Sie Ihre Frage zu beantworten:

Angenommen, Sie haben eine bestehende working Sie nur ‚svn update‘ auf die Wurzel des Verzeichnisses verwenden sollten die Dateien enthält, die Sie betrachten, wie die abruft genau das, was zwischen der aktuellen Version und der HEAD-Revision mit den am wenigsten Daten möglich verändert.

ältere Sourcecode-Management-Systeme wie CVS und VSS den Server für jede Datei gefragt hat diese Datei geändert? , während Subversion sendet nur die Änderungen eines Baumes als eine einzige Aktion. Wenn Sie eine Liste von Dateien svn update übergeben Sie diesen Vorteil nicht haben.

Daher ist die effizienteste Art und Weise zu übertragen, was gerade geändert hat ist die Aktualisierung. Dieser überträgt nur eine binäre diff der Änderungen in HEAD im Vergleich zur Basisversion Ihrer Arbeitskopie.


Wenn das Problem, das Sie versuchen zu lösen ist, dass svn update ist zu langsam, dann versuchen wir, dass für Subversion 1.7 zu lösen.

Diese Version wird ein neue Arbeitskopie Datenspeicherformat einzuführen, die einfachen Operationen machen, die eine ganze Arbeitskopie (wie die Aktualisierung) viel schneller zu sperren hat.

svn diff -r starting_revision: ending_revision_or_HEAD --summarize

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top