Subversion: Schauen Sie sich nur die von einem bestimmten Commit betroffenen Dateien an
-
13-09-2019 - |
Frage
In Subversion ist es möglich, sich zu überprüfen nur Diese während eines bestimmten Commits betroffenen Dateien, sofern Sie die spezifische Revisionsnummer kennen?
Lösung
Ich denke, dass eine Subversion Check -out nur einen bestimmten Ordner und keine einzelnen Dateien überprüfen kann. Das heißt, der Befehl:
svn log -r *revision* -q -v
Listet die mit der angegebenen Revision verbundenen Änderungen auf, damit Sie die Ausgabe dieses Befehls verarbeiten können, um die gewünschten Dateien nach dem Überprüfen eines Arbeitsordners für das vollständige Verzeichnis auf irgendwo zu kopieren.
Andere Tipps
Sie können eine Liste von Dateien erhalten, die seit einer bestimmten Revision wie folgt geändert werden:
svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt
Erstellen Sie dann ein Skript, um jede Datei in der Datei -schanked.txt zu überprüfen
Ich denke, es ist möglich, dass Sie den Begriff "Check out" hier im CVS -Sinne verwenden, dh ein "SVN -Update". Ist das richtig?
Wenn ja, können Sie die gewünschte Überarbeitung aktualisieren:
svn update -r12345
oder sogar nur diese Dateien zu dieser Revision:
svn update -r12345 file1 file2 file3
Sie müssen jedoch die Liste der Dateien von SVN unter Verwendung einiger anderer Vorschläge erhalten.
Ich weiß, dass es etwas abseits ist, aber ich verwende Trac, um dies zu tun, und es exportiert nur die Dateien, die zwischen 2 Revisionen als ZIP -Archiv mit den Dateien in ihrer ursprünglichen Verzeichnisstruktur geändert werden.
svn checkout
Funktioniert nur auf Verzeichnisebene, nicht auf der Dateiebene. Wenn alle Änderungen in einem bestimmten Änderungssatz aus demselben Verzeichnis stammen, können Sie die ausführen svn checkout <url> <path> -r<revid>
.
Sie können die Liste der betroffenen Dateien verwenden svn log -q -v -r123 url
.
Wenn Sie wirklich nur die betroffenen Dateien erhalten möchten, die Sie verwenden können svn cat urlToFile -r123 > myfile
Für jede Datei.
Wenn Sie eine aktuelle Version von SVN verwenden, können Sie einen leeren Ordner auschecken und dann die spezifischen Dateien aktualisieren.
Nachdem Ihre Liste der Dateien ausgewählt wurde,
svn co --depth=empty url dest
cd dest
svn up file1 file2 file3
Bearbeiten: Ziemlich die gleiche Lösung wie die akzeptierte Antwort hier: Checkout einer Datei aus Subversion
Hier ist eine Möglichkeit, es zu tun.
svn co -Depth leer SVN: // MyRepository/MyTrunk
CD MyTrunk
svn diff -c [revnum] svn: // myrepository/mytrunk | Grep "Index:" | awk '{print $ 2}' | Xargs -n 1 SVN -Update -Parenten
Die Ausgabe des awk-Ein-Liners ist eine Liste von Dateien, die mit relativen Pfaden geändert wurden. Wie bereits erwähnt, funktioniert das Update auf einzelnen Dateien, während die Checkout auf Modulen funktioniert. Die Option "-Parenten" erzwingt die Erstellung von Verzeichnissen in Ihrer Arbeitskopie nach Bedarf.
Beachten Sie, dass Update auch eine Option "-Changelist" (zumindest in V.1.7.1+) hat, aber es schien nicht das zu tun, was ich wollte.
Ich brauchte eine Entpassung aller Dateien, die sich in einem Bereich von einem Dutzend Überarbeitungen geändert hatten. Ich habe es so gemacht (diese Befehle sind vielleicht nicht perfekt, dies ist nur eine allgemeine Erklärung):
Erstellen Sie einen Diff, der die benötigten Dateien anzeigt, und schreiben Sie die Liste in eine Textdatei
svn diff --summarize -r219:232 > r219-232_Summary.txt
Dadurch erhalten Sie eine Textdatei mit Zeilen wie
M path/to/file.php
Massieren Sie das Dateiformat, um den Beginn jeder Zeile durch einen Befehl "svn up" anstelle von "a" oder "m" oder was auch immer zu ersetzen.
sed -i 's/A /svn up /g' ./r219-232_Summary.txt
... was dir Zeilen wie wie
svn up path/to/file.php
Erstellen Sie ein neues Verzeichnis und lesen Sie Ihr Projekt dazu
svn co http://www.repo.net/whatever
Entfernen Sie alles im Verzeichnis mit Ausnahme der .svn -Datei (ich verwende einen relativ aktuellen SVN -Client. Wenn Sie also in einem alten SVN -Client sind, der in jedem Verzeichnis einen .svn hat, nicht sicher, wie das funktionieren wird)
rm -rf ./*
Kopieren Sie in Ihre Textdatei, machen Sie sie ausführbar und führen Sie sie als Skript aus.
cp /path/to/wherever/r219-232_Summary.txt ./r219-232_Summary.sh
chmod 777 ./r219-232_Summary.sh
./r219-232_Summary.sh
Wenn alles wie geplant verläuft, sollte Shell jeden Befehl "svn up" in Ihrer Textdatei analysieren und das Verzeichnis nur mit den Dateien füllen, an denen Sie interessiert sind.
Hier ist eine einfache Bash -Skriptversion. Ich habe ein "Suchmuster" verwendet, um unnötige Zeilen zu entfernen. Revision, Repository -Adresse und Zielpfad werden als Argumente angegeben, aber sie könnten hartcodiert werden.
#!/bin/bash
REVISION=${1}
REPOSITORY="${2}"
DEST_PATH="${3}"
SEARCH_PATTERN="trunk"
FILES=$(svn log -q -v $REPOSITORY -r $REVISION | grep $SEARCH_PATTERN)
mkdir -p $DEST_PATH
for FILE in $FILES ; do
if [[ $FILE == *"$SEARCH_PATTERN"* ]]
then
FOLDER=$(dirname $FILE)
mkdir -p $DEST_PATH/$FOLDER
svn export -r $REVISION $REPOSITORY/$FILE $DEST_PATH/$FOLDER
fi
done
#EOF
Sie können genau die Liste der Dateien in einer bestimmten Änderung mithilfe von Verwendung erhalten
svn log -v -q -r rev
Sie können dann die Markierungen an der Vorderseite der Linie mit einem Rohr wie aufräumen
sed -e "s/^ . / /" | egrep -v "Changed paths:|-----"
. Um nur die Dateien zu erhalten, würden Sie wahrscheinlich verwenden svn cat
wie von Nikolai vorgeschlagen.
Bearbeitet, um die SED -Pipeline zu bereinigen und zu vereinfachen.
Es tut mir leid, eine lang tote Frage wiederzubeleben, aber sie wurde nie zu meiner Zufriedenheit beantwortet.
Sie können ein einfaches Werkzeug für Sie mit SVNKit erstellen. ich habe das gefunden Blog darüber, und modifizierte den Code leicht für meine Bedürfnisse. Ich benutze es bis heute in meinem Bereitstellungsprozess.
Es macht einen Export, kein Checkout, aber ich bin sicher, das wäre eine einfache Änderung.
SVN MergeInfo --how-revs förderfähig http: //base.com.rev1 http: //base.com.rev2
Dies wird viele Überarbeitungen geben
Jetzt möchten Sie die Liste der Dateien in jeder Revision sehen. Nehmen Sie also die Liste der Überarbeitung und kopieren Sie in Note Pad oder EditPlus und ändern Sie, damit sie in eine Zeile passen
SVN log -r R33521 -R33762 -3456 -R5623 -q -v >> Missenfiles.txt
Hinweis: Ich hatte 118 Überarbeitungen und konnte nicht die Liste der Dateien korrekt erhalten. Also habe ich den obigen Befehl durchgeführt, indem ich in Untergruppen der Revision eingebrochen bin