Saya menggunakan git-svn
untuk bekerja melawan repositori pusat Subversion perusahaan saya. Kami baru-baru ini membuat cabang fitur baru di repo pusat.
Bagaimana saya memberi tahu Git tentang hal itu? Ketika saya menjalankan, git branch -r
saya hanya bisa melihat cabang yang ada ketika saya berlari fetch
melawan repo Subversion untuk menginisialisasi repo Git saya?
Jawaban:
Anda dapat secara manual menambahkan cabang jarak jauh,
sumber
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
pada langkah checkout git.Jika Anda ingin melacak SEMUA cabang svn jauh, maka solusinya semudah:
Ini akan mengambil SEMUA cabang jarak jauh yang belum diambil.
Kiat ekstra: jika Anda hanya memeriksa trunk pada awalnya, dan kemudian Anda ingin melacak SEMUA cabang, kemudian edit
.git/config
agar terlihat seperti ini dan jalankan kembaligit svn fetch
:Poin-poin kunci adalah
url
harus menunjuk ke root repositori, dan jalur yang didefinisikanfetch
danbranches
harus relatif terhadapurl
.Jika Anda ingin mengambil hanya cabang tertentu dan bukan SEMUA, ada contoh yang bagus di
git svn --help
:Dengan versi yang lebih lama
git-svn
, setelah Anda menentukan cabang seperti ini, Anda mungkin tidak bisa mendapatkan cabang barugit svn fetch
. Satu solusi adalah menambahkan lebih banyakfetch
baris, seperti ini:Solusi lain oleh @AndyEstes: edit
.git/svn/.metadata
dan ubah nilaibranches-maxRev
atautags-maxRev
ke revisi sebelum cabang atau tag yang baru ditentukan dibuat. Setelah Anda selesai melakukannya, jalankangit svn fetch
untuk melacak cabang jauh svn baru.sumber
.git/svn/.metadata
sangat membantu! Saya menambahkan cabang tambahan di kantor saya.git/config
, yanggit svn fetch
tidak aktif - karena nomor revisi metadata "terlalu jauh ke depan". Dalam satu kasus, hanya komit terakhir dari cabang yang diambil. Saya secara manual menyingkirkan cabang yang salah (diganti namanya.git/svn/refs/remotes/svn/qa/XYZ
menjadi.git/svn/refs/remotes/svn/qa/XYZ~
, hilangkan keberadaannya di.git/packed-refs
, dll) ... memilih nomor revisi "sebelumnya" untuk metadata ... dijalankangit svn fetch
untuk akhirnya mendapatkan sejarah penuh dengan grafik yang terhubung.git svn fetch --all
.Tampaknya saya hanya perlu
git svn fetch
; entah bagaimana saya telah meyakinkan diri saya sendiri bahwa akan mengambil seluruh repo bukan hanya perubahan.sumber
Mungkin aku mengacaukannya entah bagaimana tetapi aku mengikuti instruksi dalam jawaban vjangus dan itu hampir berhasil. Satu-satunya masalah adalah bahwa cabang baru tampaknya tidak bercabang dari bagasi. Di gitk, itu semacam "mengambang" sendiri; ia tidak memiliki leluhur yang sama dengan belalainya.
Solusi untuk ini adalah:
git diff-tree <sha1 from step 1> <sha1 from step 2>
- seharusnya tidak ada output. Jika ada output, Anda mungkin telah memilih komit yang salah.git checkout local-newbranch
kemudiangit rebase <sha1 from step 1>
. Ini akan rebaselocal-newbranch
ke pohon baru tetapiremotes/newbranch
masih akan terputus..git/refs/remotes/newbranch
dan edit untuk mengandung SHA1 lengkap dari komit baru (pada rebasednewbranch
) yang sesuai dengan komit lama yang saat ini ditunjukinya. (Atau mungkin digunakangit-update-ref refs/remotes/newbranch <new-SHA>
. Terima kasih inger.)git svn dcommit
melakukannyanewbranch
, Anda akan mendapatkan banyak pesan tentang hal itu memperbarui beberapa log. Ini normal menurut saya.Saya sarankan untuk tetap
gitk --all
membuka sepanjang waktu dan menyegarkannya untuk melacak apa yang Anda lakukan. Saya masih semacam baru untuk git dan git svn jadi tolong sarankan perbaikan metode ini.sumber
Penyederhanaan jawaban vjangus:
Jika Anda menggunakan tata letak standar di SVN dan telah melakukan init svn seperti biasa, git-svn akan melakukan hal-hal konfigurasi untuk Anda. Hanya:
Sebuah contoh. URL SVN adalah
svn+ssh://[email protected]/repo
. Cabang SVN yang saya cari adalahnewbranch
. Cabang git lokal (pelacakan jarak jauhnewbranch
) akangit-newbranch
.Langkah 1: cari revisi cabang-salinan
Jadi titik cabang di SVN adalah revisi 7802.
Langkah 2: Ambil revisi
git-svn melakukan semua pekerjaan dan sekarang tahu tentang remote:
Langkah 3: Buat cabang lokal baru Anda melacak yang jauh:
sumber
show-ref
tidak ternilai)! Bagi siapa pun yang terjebak dengan rujukan yang salah cabang jauh, Anda dapat menghapusnya (saya harus melakukangit branch -d newbranch
dan kemudian paksa menghapus dir ref.git/svn/refs/remotes/newbranch
) dan kemudian mulai lagi pada langkah 2 (di atas).Saya belum menemukan dokumentasi tentang fitur ini, tetapi sepertinya konfigurasi git svn mendukung banyak entri pengambilan. Dengan cara ini Anda juga dapat menambahkan cabang secara terpisah tanpa perlu menambahkan entri repositori svn jarak jauh lain ke konfigurasi Anda atau menggunakan wildcard untuk mendapatkan semua cabang direktori tertentu.
Asumsikan bahwa pohon SVN Anda benar-benar jahat memiliki banyak cabang tanpa logika bagaimana mereka berada, misalnya memiliki cabang dan sub-direktori yang mengandung lebih banyak bercabang.
yaitu
dan Anda hanya ingin memilih sendiri beberapa cabang yang akan dimasukkan ke repositori git Anda.
Anda mungkin pertama-tama init repositori Anda dengan hanya trunk tanpa cabang tambahan:
Setelah itu Anda akan melihat konfigurasi berikut:
kapan pun Anda ingin mengambil cabang baru dari MyRepo Anda bisa menambahkan entri ambil baru ke konfigurasi dengan:
Atau Anda dapat mengedit konfigurasi yang sama di .git / config
Untuk mengambil cabang baru setelah menambahkannya ke konfigurasi cukup jalankan:
[Sunting] Kadang-kadang tampaknya perlu menjalankan fetch dengan --all parameter untuk mengambil cabang yang baru ditambahkan:
sumber
Alih-alih berurusan dengan kebiasaan git-svn, Anda dapat mencoba SubGit .
Kita harus menginstal SubGit ke dalam repositori Subversion. Setelah itu orang dapat menggunakan alur kerja git standar alih-alih menggunakan perintah git-svn khusus:
Mendorong komitmen baru:
git-svn:
SubGit:
Mengambil perubahan yang masuk
git-svn:
SubGit:
Membuat cabang baru:
git-svn:
SubGit:
Lihat dokumentasi SubGit untuk lebih jelasnya.
sumber
Untuk menambah jawaban vjangus, yang membantu saya, saya juga merasa berguna untuk menambahkan menggunakan git cangkok untuk mengikat cabang ke bagasi pada titik yang tepat - memungkinkan git untuk melihat sejarah dan melakukan penggabungan dengan benar.
Ini hanyalah kasus penambahan garis
.git/info/grafts
dengan hash:misalnya.
Kredit untuk http://evan-tech.livejournal.com/255341.html
(Saya akan menambahkan ini sebagai komentar, tetapi saya tidak memiliki reputasi yang cukup.)
sumber
Jika Anda tidak memeriksa dengan tata letak yang valid, Anda tidak akan dapat checkout cabang jauh.
Inilah yang saya lakukan:
Setelah itu, Anda dapat beralih ke cabang jarak jauh:
Maka Anda akan secara otomatis beralih ke cabang Anda.
sumber