Bagaimana cara git-svn mengkloning revisi terakhir dari repositori Subversion?

314

Masalah

Bagaimana Anda membuat salinan dangkal dengan git-svn dari repositori Subversion, misalnya bagaimana Anda hanya menarik tiga revisi terakhir?

The git cloneperintah bisa mendapatkan n revisi terakhir dari repositori Git jika Anda menggunakan opsi --depth, yaitu Anda mendapatkan salinan dangkal repositori. Contoh:

git clone --depth 3 git://some/repo myshallowcopyrepo

Apakah ada opsi serupa untuk git-svn?

Penemuan saya sejauh ini

Sejauh ini saya hanya menemukan -rNopsi di mana Nrevisi untuk menarik. Contoh:

git svn clone -rN svn://some/repo

Menurut dokumentasi ada kemungkinan untuk digunakan -r$REVNUMBER:HEAD. Saya mencoba yang berikut ini untuk mendapatkan 3 revisi terakhir yang mengembalikan pesan kesalahan.

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

Jadi saya diganti HEAD~3dengan angka aktual revisi ketiga tetapi revisi 534. Itu berhasil, tetapi itu mengharuskan saya untuk mencari tahu dulu angka revisi dari komit ketiga tetapi terakhir.

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

Dokumentasi

git-klon

git-svn

Lernkurve
sumber
6
Menjawab pertanyaan saya sendiri: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(tetapi tidak berhasil untuk saya)
Sebastián Grignoli
Bagaimana keras itu akan menerapkan --depthuntuk git svn, karena dukungan yang sudah ada. Dan itu sudah harus mencari tahu rev ​​terbaru dari server?
Peter Cordes

Jawaban:

238

Anda telah menemukan cara paling sederhana untuk menentukan klon dangkal di Git-SVN, dengan menentukan nomor revisi SVN yang ingin Anda mulai klon di ( -r$REV:HEAD ).

Sebagai contoh: git svn clone -s -r1450:HEAD some/svn/repo

Struktur data Git didasarkan pada petunjuk dalam grafik asiklik terarah (DAG), yang membuatnya sepele untuk berjalan dengan nkomit. Tetapi di SVN (dan karenanya di Git-SVN) Anda harus menemukan nomor revisi sendiri.

Paul
sumber
5
bagaimana jika saya ingin terus mengkloning revisi sebelumnya di masa depan, apakah mungkin?
Zennichimaro
5
@Zennichimaro: Anda dapat melakukannya dengan menambahkan git-svnpengarah jarak jauh di tempat yang sama dan menggunakan git-svn fetchuntuk mendapatkan lebih banyak pohon. Pada titik itu Anda harus menggunakan git filter-branchuntuk mereparasi pohon tua (sebagian) ke cabang kanan.
Ben Jackson
Paul ada cara bagi saya untuk mendapatkan revisi terbaru dengan melakukan Migrasi Tambahan dari SVN ke Git ( stackoverflow.com/questions/29161646/… )
SabareeshSS
1
SVN menggunakan bilangan bulat berturut-turut untuk mengidentifikasi revisi, membuatnya bahkan lebih sepele untuk berjalan kembali nmelakukan ...
berbahaya
Saya pikir ada ruang yang hilang setelah -r. Untuk eg git svn clone -r 1133: HEAD some / svn / repo
Gnana
92

Saya menemukan diri saya sering menggunakan yang berikut ini untuk mendapatkan sejumlah revisi dari pohon subversi kami yang besar (kami akan segera mencapai svn revisi 35000).

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

Dan cara yang baik untuk mengetahui di mana cabang dimulai adalah dengan melakukannya svn logdan menemukan yang pertama di cabang (yang terakhir terdaftar saat melakukan):

svn log --stop-on-copy svn://some/repo/branch/some-branch

Sejauh ini saya belum benar-benar menemukan kesulitan dalam melacak semua cabang. Butuh terlalu banyak waktu untuk mengkloning dan svn dan git tidak bekerja bersama sebaik yang saya inginkan. Saya cenderung membuat file tambalan dan menerapkannya pada klon git dari cabang svn lain.

Kristen
sumber
1
+1 dari saya - membantu saya menyelesaikan kesalahan 128 masalah saya mengkloning seluruh svn repo
Ian Oxley
perintah svn log persis seperti yang saya cari! terima kasih
mrbrdo
1
Repos yang saya gunakan memiliki percabangan dan tata letak non-standar, jadi saya biasanya membuat repo Git lokal untuk setiap cabang SVN, lalu cherry-pick/ di rebaseantaranya. Komit mengambil langkah ekstra ( push, kemudian dcommitdari repo jarak jauh), tapi saya pikir itu layak untuk tradeoff.
chronospoon
Tidak memikirkan hal itu, mungkin lebih cepat hanya mengkloning tag / cabang tertentu seperti yang Anda katakan :)
VeenarM
34

... 7 tahun kemudian, di padang pasir, pukulan tumbleweed oleh ...

Saya tidak puas dengan jawaban yang diterima sehingga saya membuat beberapa skrip untuk melakukan ini untuk Anda yang tersedia di Github . Ini harus membantu siapa saja yang ingin menggunakan git svn clonetetapi tidak ingin mengkloning seluruh repositori dan tidak ingin berburu untuk revisi tertentu untuk dikloning di tengah sejarah (mungkin Anda mengkloning sekelompok repo). Di sini kita bisa mengkloning revisi N terakhir:

Gunakan git svn cloneuntuk mengkloning 50 revisi terakhir

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

Temukan revisi N sebelumnya dari repo SVN

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     
jonathan
sumber
Akan memberikan celah ini, repo kami memiliki sekitar 170.000 revisi dan butuh waktu terlalu lama untuk melakukan satu proyek, dan saya memiliki lebih dari 10 proyek spesifik dalam repo untuk dilakukan: | Mengingat hanya melakukan 3-4 tahun sejarah saja.
VeenarM
1
Terima kasih telah berbagi ini!
Kai Mechel