Ich denke, @Aredridels Beitrag war am nächsten, aber da steckt noch ein bisschen mehr dahinter - also werde ich dies hier hinzufügen. Die Sache ist, svn
wenn Sie sich in einem Unterordner eines Repos befinden und Folgendes tun:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
dann svn
werden alle Dateien exportieren , die unter Revisionskontrolle sind (sie auch frisch hinzugefügt haben könnte, oder Modified - Zustand) - und wenn Sie andere „Junk“ in diesem Verzeichnis haben (und ich bin nicht mitgerechnet .svn
Unterordner hier, aber sichtbare Dinge wie .o
Dateien) wird es nicht exportiert; Es werden nur die vom SVN-Repo registrierten Dateien exportiert. Für mich ist eine schöne Sache, dass dieser Export auch Dateien mit lokalen Änderungen enthält, die noch nicht festgeschrieben wurden. und eine andere schöne Sache ist, dass die Zeitstempel der exportierten Dateien die gleichen sind wie die Originaldateien. Oder wie svn help export
es heißt:
- Exportiert einen sauberen Verzeichnisbaum aus der von PATH1 angegebenen Arbeitskopie bei Revision REV, wenn er andernfalls bei WORKING angegeben ist, in PATH2. ... Wenn REV nicht angegeben ist, bleiben alle lokalen Änderungen erhalten. Dateien, die nicht der Versionskontrolle unterliegen, werden nicht kopiert.
git
Vergleichen Sie die Ausgabe dieser Befehle (in einem Unterordner eines git
Repos Ihrer Wahl) , um festzustellen, dass die Zeitstempel nicht erhalten bleiben :
/media/disk/git_svn/subdir$ ls -la .
... und:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... und ich git archive
stelle auf jeden Fall fest, dass alle Zeitstempel der archivierten Datei gleich sind! git help archive
sagt:
Das Git-Archiv verhält sich bei Angabe einer Baum-ID anders als bei Angabe einer Commit-ID oder Tag-ID. Im ersten Fall wird die aktuelle Zeit als Änderungszeit für jede Datei im Archiv verwendet. Im letzteren Fall wird stattdessen die Festschreibungszeit verwendet, die im referenzierten Festschreibungsobjekt aufgezeichnet wurde.
... aber anscheinend setzen beide Fälle die "Änderungszeit jeder Datei"; dabei nicht bleiben die tatsächlichen Zeitstempel dieser Dateien erhalten!
Um auch die Zeitstempel beizubehalten, ist hier ein bash
Skript, das eigentlich ein "Einzeiler" ist, wenn auch etwas kompliziert - daher wird es unten in mehreren Zeilen veröffentlicht:
/media/disk/git_svn/subdir$ git archive --format=tar master | (tar tf -) | (\
DEST="/media/diskC/tmp/subdirB"; \
CWD="$PWD"; \
while read line; do \
DN=$(dirname "$line"); BN=$(basename "$line"); \
SRD="$CWD"; TGD="$DEST"; \
if [ "$DN" != "." ]; then \
SRD="$SRD/$DN" ; TGD="$TGD/$DN" ; \
if [ ! -d "$TGD" ] ; then \
CMD="mkdir \"$TGD\"; touch -r \"$SRD\" \"$TGD\""; \
echo "$CMD"; \
eval "$CMD"; \
fi; \
fi; \
CMD="cp -a \"$SRD/$BN\" \"$TGD/\""; \
echo "$CMD"; \
eval "$CMD"; \
done \
)
Beachten Sie, dass davon ausgegangen wird, dass Sie den Inhalt in das "aktuelle" Verzeichnis (oben /media/disk/git_svn/subdir
) exportieren - und das Ziel, in das Sie exportieren, etwas ungünstig platziert ist, sich jedoch in einer DEST
Umgebungsvariablen befindet. Beachten Sie, dass mit diesem Skript; Sie müssen die erstellenDEST
Verzeichnis manuell selbst , bevor Sie das obige Skript ausführen.
Nachdem das Skript ausgeführt wurde, sollten Sie in der Lage sein zu vergleichen:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... und hoffentlich die gleichen Zeitstempel sehen (für die Dateien, die unter Versionskontrolle standen).
Hoffe das hilft jemandem,
Prost!