Saya pikir posting @Aredridel adalah yang terdekat, tetapi ada sedikit lebih dari itu - jadi saya akan menambahkan ini di sini; masalahnya adalah, di svn, jika Anda berada dalam subfolder dari repo, dan Anda melakukannya:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
kemudian svnakan mengekspor semua file yang berada di bawah kendali revisi (mereka mungkin juga baru saja ditambahkan; atau status yang dimodifikasi) - dan jika Anda memiliki "sampah" lain di direktori itu (dan saya tidak menghitung .svnsubfolder di sini, tetapi hal-hal yang terlihat seperti .ofile) , itu tidak akan diekspor; hanya file-file yang terdaftar oleh repo SVN yang akan diekspor. Bagi saya, satu hal yang menyenangkan adalah bahwa ekspor ini juga menyertakan file dengan perubahan lokal yang belum dilakukan; dan satu lagi yang menyenangkan adalah bahwa cap waktu dari file yang diekspor sama dengan yang asli. Atau, seperti yang svn help exportdikatakan:
- Mengekspor pohon direktori bersih dari copy pekerjaan yang ditentukan oleh PATH1, pada revisi REV jika diberikan, jika tidak di BEKERJA, ke PATH2. ... Jika REV tidak ditentukan, semua perubahan lokal akan dipertahankan. File yang tidak di bawah kendali versi tidak akan disalin.
Untuk menyadari bahwa gittidak akan menyimpan stempel waktu, bandingkan output dari perintah-perintah ini (dalam subfolder dari gitrepo pilihan Anda):
/media/disk/git_svn/subdir$ ls -la .
... dan:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... dan saya, dalam hal apapun, pemberitahuan yang git archivemenyebabkan semua cap waktu dari file yang diarsipkan sama! git help archivemengatakan:
arsip git berperilaku berbeda ketika diberi ID pohon versus ketika diberikan ID komit atau ID tag. Dalam kasus pertama waktu saat ini digunakan sebagai waktu modifikasi setiap file dalam arsip. Dalam kasus terakhir, waktu komit yang dicatat dalam objek komit yang direferensikan digunakan sebagai gantinya.
... tetapi ternyata kedua kasus mengatur "waktu modifikasi setiap file"; dengan demikian tidak menjaga cap waktu yang sebenarnya dari file-file itu!
Jadi, untuk menjaga stempel waktu, berikut adalah bashskrip, yang sebenarnya adalah "satu-liner", meskipun agak rumit - jadi di bawah ini diposting dalam beberapa baris:
/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 \
)
Perhatikan bahwa diasumsikan bahwa Anda mengekspor konten dalam direktori "saat ini" (di atas, /media/disk/git_svn/subdir) - dan tujuan tujuan Anda mengekspornya agak tidak nyaman, tetapi berada dalam DESTvariabel lingkungan. Perhatikan bahwa dengan skrip ini; Anda harus membuat DESTdirektori sendiri secara manual, sebelum menjalankan skrip di atas.
Setelah skrip dijalankan, Anda harus dapat membandingkan:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... dan semoga melihat cap waktu yang sama (untuk file-file yang berada di bawah kontrol versi).
Semoga ini bisa membantu seseorang,
Ceria!