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 svn
akan 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 .svn
subfolder di sini, tetapi hal-hal yang terlihat seperti .o
file) , 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 export
dikatakan:
- 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 git
tidak akan menyimpan stempel waktu, bandingkan output dari perintah-perintah ini (dalam subfolder dari git
repo 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 archive
menyebabkan semua cap waktu dari file yang diarsipkan sama! git help archive
mengatakan:
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 bash
skrip, 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 DEST
variabel lingkungan. Perhatikan bahwa dengan skrip ini; Anda harus membuat DEST
direktori 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!