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 svn
esporterà 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 .svn
sottocartelle qui, ma cose visibili come .o
file) , 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 export
dirla:
- 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 git
non manterrà i timestamp, confronta l'output di questi comandi (in una sottocartella di un git
repository 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 archive
fa sì che tutti i timestamp del file archiviato siano gli stessi! git help archive
dice:
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 bash
script, 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 DEST
variabile 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!