Frage SVN Alle Revisionen einer Datei erhalten


Ich habe ein mittelgroßes Repository (ca. 2500 Versionen) von einem Projekt, das ich in den letzten 3 Jahren ausgeführt habe. Es gibt dort eine bestimmte Datei (nennen wir es foo.xml), die ich jetzt analysieren möchte. Idealerweise ist das, was ich suche, in jedes Verzeichnis zu exportieren, das die Datei hatte, an das Datum angehängt, z.

2007_08_08_foo.xml
2007_08_09_foo.xml
2007_08_15_foo.xml
...

Was ist der schnellste Weg, dies zu erreichen?


6
2017-07-05 03:10


Ursprung


Obwohl dies keine direkte Antwort auf Ihre Frage ist, möchten Sie vielleicht 'svn annotate filename' verwenden. Das ist ein guter Weg, um die Evolution zu studieren. - vtest


Antworten:


Ich glaube nicht, dass SVN diese Funktionalität eingebaut hat, aber wenn Sie Befehle auf dem Server ausführen können, der das SVN-Repository enthält (und vorausgesetzt, der Server verfügt über die Standard-UNIX / Linux-Tools), sollte dieses Bash-Skript dies tun Sie:

REPOS=/path/to/repos
FILE=dir/foo.xml
for rev in "$(svnlook history $REPOS $FILE | awk 'NR > 2 { print $1 }')"; do
    rev_date=$(svnlook date -r $rev $REPOS | awk '{ print $1 }')
    svnlook cat -r $rev $REPOS $FILE > ${rev_date}_${FILE}
done

Dies erzeugt Dateinamen des Formulars 2007-08-08_foo.xml. Natürlich musst du dich ändern /path/to/repos in der ersten Zeile zum eigentlichen Dateisystempfad (keine URL) des Repositorys und dir/foo.xml in der zweiten Zeile zum Pfad der Datei im Repository.

Wenn es wirklich wichtig ist, Unterstriche im Datum zu haben, ändern Sie Zeile 4 wie folgt:

    rev_date=$(svnlook date -r $rev $REPOS | awk '{ print $1 }' | tr - _)

Bedenken Sie auch, dass, wenn die Datei an einem bestimmten Tag mehrmals geändert wurde, nur die erste Änderung an jedem Tag in den geschriebenen Dateien enthalten ist.


4
2017-07-05 05:42





Mein Kollege hat dieses Shell-Skript für einen ähnlichen Zweck geschrieben:

#! / bin / bash
für rev in `svn log $ 1 | grep ^ r [0-9] | cut -c 2- | geschnitten -d '' -f 1`; machen
    svn log -r $ rev
    svn diff -r $ [$ rev-1]: $ rev $ 1 2> / dev / null || svn cat -r $ rev $ 1
erledigt

Sie benötigen keinen Serverzugriff, um es auszuführen; Führen Sie es in einem Verzeichnis aus, in dem Sie diese Datei ausgecheckt haben, und übergeben Sie einen Dateinamen als Argument. Vielleicht möchten Sie den Loop-Body ändern, um ganze Dateien zu schreiben, statt Diffs nach stdout zu drucken:

machen
    svn cat -r $ rev $ 1> $ 1. $ rev
erledigt

2
2017-07-11 13:43



Das Extrahieren von Daten für jede Revision und das Einfügen in den Dateinamen wird dem Leser als Übung überlassen. - Marius Gedminas


Ich hatte Probleme mit einem der Skripte in dieser Antwort. Es schien nicht zu funktionieren, wenn ein Leerzeichen in einem Dateinamen vorhanden war. Ich bin kein Meister im Bash-Scripting, aber das ist eine schnelle Lösung.

#!/bin/bash
echo "svn log \"$1\" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1"
for rev in `svn log "$1" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1`; do
    svn log -r $rev
    #svn diff -r $[$rev-1]:$rev $1 2>/dev/null || svn cat -r $rev $1
    `svn cat -r $rev "$1" > "$rev.$1"`
done

1
2018-04-03 04:09