Penso che il post di @Aredridel fosse il più vicino, ma c'è un po 'di più in questo - quindi lo aggiungerò qui; il fatto è, in svn, se sei in una sottocartella di un repository, e lo fai:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
quindi svnesporterà tutti i file che sono sotto controllo di revisione (potrebbero anche averli aggiunti di recente; o stato modificato) - e se hai altra "spazzatura" in quella directory (e non sto contando .svnsottocartelle qui, ma cose visibili come .ofile) , sarà non essere esportato; verranno esportati solo i file registrati dal repository SVN. Per me, una cosa bella è che questa esportazione include anche file con modifiche locali che non sono ancora stati impegnati; e un'altra cosa carina è che i timestamp dei file esportati sono gli stessi di quelli originali. O, per svn help exportdirla:
- Esporta un albero di directory pulito dalla copia di lavoro specificata da PATH1, alla revisione REV se viene fornito, altrimenti in WORKING, in PATH2. ... Se non viene specificato REV, tutte le modifiche locali verranno conservate. I file non sotto controllo versione non verranno copiati.
Per capire che gitnon manterrà i timestamp, confronta l'output di questi comandi (in una sottocartella di un gitrepository di tua scelta):
/media/disk/git_svn/subdir$ ls -la .
... e:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... e io, in ogni caso, noto che git archivefa sì che tutti i timestamp del file archiviato siano gli stessi! git help archivedice:
git archive si comporta in modo diverso quando viene assegnato un ID albero rispetto a quando viene assegnato un ID commit o ID tag. Nel primo caso l'ora corrente viene utilizzata come ora di modifica di ciascun file nell'archivio. In quest'ultimo caso viene invece utilizzato il tempo di commit come registrato nell'oggetto commit di riferimento.
... ma a quanto pare entrambi i casi impostano il "tempo di modifica di ciascun file"; quindi no preservando i timestamp effettivi di quei file!
Quindi, al fine di preservare anche i timestamp, ecco uno bashscript, che in realtà è un "one-liner", anche se un po 'complicato - quindi sotto è pubblicato in più righe:
/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 \
)
Si noti che si presume che tu stia esportando i contenuti nella directory "corrente" (sopra, /media/disk/git_svn/subdir) - e che la destinazione in cui stai esportando sia in qualche modo scomoda, ma è nella DESTvariabile d'ambiente. Si noti che con questo script; devi creare il fileDEST manualmente directory prima di eseguire lo script sopra.
Dopo aver eseguito lo script, dovresti essere in grado di confrontare:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... e speriamo di vedere gli stessi timestamp (per quei file che erano sotto il controllo della versione).
Spero che questo aiuti qualcuno,
Salute!