svn: ganti trunk dengan cabang

155

Apa cara terbaik untuk membuat salah satu cabang dari repositori subversi menjadi trunk baru?

Telah ada penulisan ulang utama untuk keseluruhan sistem: banyak hal telah dipindahkan, ditulis ulang, diganti, dihapus, diganti dll. Kode yang ditulis ulang telah diuji dan siap untuk mengganti trunk yang lama.

Pada dasarnya, jalur utama lama (Batang 5) ditandai dan akan berakhir di sini. Cabang yang ditulis ulang (Cabang 6) akan menjadi arus utama baru (Batang 7):

Batang (1) -> Batang (2) -> Batang (5) -> × + -> Batang baru (7)
  \ \ |
  garpu bergabung ???
    \ \ |
     + -> Cabang (3) -> Cabang (4) -> Cabang (6) - +

Semua perubahan yang sedang berlangsung dari 'Bagasi' lama sudah dimasukkan dalam 'Cabang ditulis ulang'

Bagaimana saya bisa melakukan ini?

Jacco
sumber

Jawaban:

118

Gunakan svn move untuk memindahkan isi dari trunk yang lama ke tempat lain dan ganti cabang untuk trunk sesudahnya.

Perhatikan bahwa salin dan pindahkan svn berfungsi seperti operasi file. Anda dapat menggunakannya untuk memindahkan / menyalin barang-barang di repositori Anda dan perubahan-perubahan ini juga diversi versi. Pikirkan "pindah" sebagai "salin + hapus".

[EDIT] Nilbus baru saja memberi tahu saya bahwa Anda akan mendapatkan konflik gabungan saat Anda menggunakannya svn move.

Saya masih berpikir bahwa ini adalah pendekatan yang benar. Ini akan menyebabkan konflik tetapi jika Anda bergabung dengan hati-hati, kemungkinan Anda tidak akan kehilangan data apa pun. Jika itu mengganggu Anda, gunakan VCS yang lebih baik seperti Mercurial atau Git .

Aaron Digulla
sumber
1
Jika Anda melakukan ini, siapa pun dengan perubahan dalam copy pekerjaan di bagasi asli akan mengalami konflik, bahkan jika perubahan mereka harus bergabung. Ini karena file dihapus dan ditambahkan kembali - mereka diperlakukan sebagai objek terpisah dengan riwayat terpisah.
Edward Anderson
@nilbus: Apakah Anda mencobanya? IIRC, SVN menunjukkan bahwa file telah dihapus dan dibaca tetapi secara internal, ia akan tahu bahwa file telah dipindahkan.
Aaron Digulla
Iya. Saya memeriksa dua salinan. Dalam salinan pertama saya pindah dir A ke A2 dan dir B ke A. Lalu pindah A ke B, lalu A2 ke A. (ganti nama dan ganti nama kembali.) Di checkout ke-2, saya membuat perubahan ke file dan mencoba svn memperbarui. Ini bertentangan karena file yang saya ubah "telah dihapus". Secara internal itu tidak menyimpan duplikat file, tetapi Hapus yang Anda lihat benar-benar mempengaruhi Anda ketika datang ke konflik.
Edward Anderson
12
@nilbus: Pada titik ini, saya ingin mengutip Linus Torvalds: "Slogan Subversion untuk sementara waktu adalah" CVS dilakukan dengan benar ", atau sesuatu seperti itu, dan jika Anda mulai dengan slogan semacam itu, tidak ada tempat yang dapat Anda gunakan pergi. Tidak ada cara untuk melakukan CVS dengan benar. "
Aaron Digulla
3
ya. Saya akan setuju. Untuk mengatasi masalah ini, saya benar-benar memeriksa repo dengan svn-git, dan menggunakan git untuk rebase cabang ke master.
Edward Anderson
66

Saya setuju dengan menggunakan perintah svn move untuk mencapai tujuan ini.

Saya tahu orang lain di sini berpikir itu tidak biasa, tetapi saya suka melakukannya dengan cara ini. Ketika saya memiliki cabang fitur dan siap untuk menggabungkannya dengan trunk yang juga telah dimodifikasi secara signifikan, saya akan menggabungkannya ke cabang baru, biasanya dinamai <FeatureBranchName>-Merged. Lalu saya menyelesaikan konflik dan menguji kode gabungan. Setelah selesai, saya memindahkan trunk ke folder tag sehingga saya tidak kehilangan apa-apa. Terakhir saya memindahkan<FeatureBranchName>-Merged ke bagasi.

Selain itu saya lebih suka menghindari copy pekerjaan ketika melakukan gerakan, berikut adalah contoh dari perintah:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

Catatan: Saya menggunakan 1,5

Ryan Cook
sumber
1
Itu mungkin bukan praktik terbaik tetapi tentu saja yang paling efisien ketika Anda memiliki bagasi yang sangat tua dan semua orang mengerjakan cabang seolah-olah itu adalah bagasi. Itu memecahkan masalah saya!
Alex Perrin
12

Saya hanya melihat masalah ini baru-baru ini, dan solusi yang saya sangat senang melakukannya

svn menggabungkan --ignore-keturunan trunk-url branch-url

pada copy pekerjaan bagasi saya.

Ini tidak mencoba menerapkan perubahan secara historis (mempertahankan perubahan di bagasi). Ini hanya "menerapkan diff" antara trunk dan cabang. Ini tidak akan membuat konflik bagi pengguna Anda di file yang tidak dimodifikasi. Namun Anda akan kehilangan informasi Historis Anda dari cabang, tetapi itu terjadi ketika Anda tetap menggabungkan.


sumber
1
Posting svn 1.5 Anda harus dapat melakukan penggabungan yang menjaga sejarah.
NSherwin
9

Rekomendasikan Anda melakukan perubahan ini melalui alat browser repositori.

Mencoba operasi delete + move besar melalui copy pekerjaan adalah cara yang bagus untuk membunuh copy pekerjaan. Jika Anda dipaksa untuk menggunakan copy pekerjaan, lakukan komit tambahan setelah setiap operasi hapus atau pindahkan dan Perbarui copy pekerjaan Anda setelah setiap komit.

Chris Nava
sumber
Tautan ke Repo akan berguna (hanya untuk kenyamanan - simpan pencarian google :))
Brian M. Hunt
3
Maaf. Ejaannya membuatnya seperti saya merujuk ke alat khusus (diedit). Sebenarnya, sebagian besar alat GUI SVN harus memiliki fitur browser repositori. FYI: Saya menggunakan tortoise tortoisesvn.tigris.org
Chris Nava
4

Jika Anda ingin menjadikan cabang sebagai trunk baru (yaitu) singkirkan semua perubahan pada trunk yang dibuat sejak cabang dibuat, Anda bisa 1. Membuat cabang trunk (untuk keperluan cadangan) 2. "mengembalikan perubahan "pada trunk (pilih semua revisi setelah cabang dibuat 3. Gabungkan cabang kembali ke trunk.

Sejarah harus tetap seperti ini.

Salam, Roger

rboerdijk
sumber
3

Solusi @Aaron Digulla dan @kementeus bisa diterapkan. Untuk repositori Subversion 1.4, operasi penyalinan / pemindahan dapat membuat migrasi di masa mendatang ke struktur repositori berbeda atau memisahkan repositori.

Saya percaya peningkatan 1.5 termasuk resolusi yang lebih baik dari memindahkan / menyalin riwayat, jadi itu mungkin tidak akan menjadi masalah untuk repositori 1.5.

Untuk repositori 1.4, saya akan merekomendasikan menggunakan svnadmin dumpdan svndumpfilteruntuk melakukan pergerakan trunk yang ada di tempat lain, kemudian memindahkan cabang ke trunk dengan mekanisme yang sama. Muat kedua dumpfiles ke repositori pengujian, verifikasi, lalu pindahkan ke produksi.

Tentu saja, buat cadangan repositori Anda yang sudah ada sebelum memulai.

Ini menjaga sejarah tanpa merekam gerakan / salinan secara eksplisit dan membuat pengorganisasian kembali di masa depan, menjaga sejarah, lebih mudah.


Sunting: Seperti yang diminta, dokumentasi perilaku 1.4, dari buku 1.4 Red-Bean, Filtering Repository History

Juga, jalur yang disalin dapat memberi Anda beberapa masalah. Subversi mendukung operasi penyalinan di repositori, di mana jalur baru dibuat dengan menyalin beberapa jalur yang sudah ada. Ada kemungkinan bahwa pada suatu saat dalam masa penyimpanan Anda, Anda mungkin telah menyalin file atau direktori dari beberapa lokasi yang svndumpfiltertidak termasuk, ke lokasi yang disertakan. Untuk membuat data dump mandiri,svndumpfilterharus tetap menunjukkan penambahan jalur baru — termasuk konten file apa pun yang dibuat oleh salinan — dan tidak menyatakan penambahan itu sebagai salinan dari sumber yang tidak akan ada dalam aliran data dump yang difilter. Tetapi karena format dump repositori Subversion hanya menunjukkan apa yang diubah di setiap revisi, isi dari sumber salinan mungkin tidak tersedia. Jika Anda mencurigai bahwa Anda memiliki salinan semacam ini di repositori Anda, Anda mungkin ingin memikirkan kembali set jalur yang disertakan / dikecualikan, mungkin termasuk jalur yang berfungsi sebagai sumber operasi penyalinan Anda yang merepotkan juga.

Ini berlaku untuk migrasi / reorganisasi yang menggunakan svndumpfilter. Ada saat-saat ketika sedikit pekerjaan ekstra sekarang dapat menghemat banyak pekerjaan tambahan nanti, dan dengan menjaga penggunaan yang mudah svndumpfiltertersedia untuk migrasi / reorganisasi masa depan mengurangi risiko dengan biaya yang relatif rendah.

Ken Gentle
sumber
Mengapa "svn move" tidak mencukupi? Saran Anda sepertinya memencet lalat dengan palu godam.
Rob Williams
Saya telah digigit oleh perilaku 1.4 ini - jika repositori SVN berisi gerakan (penggantian nama) direktori atau cabang / tag, gunakan svndumpfilter untuk membantu mengatur ulang / memigrasi repositori ke struktur baru bisa gagal karena tidak menangani sejarah baik. Sudah didokumentasikan, saya akan menggali referensi. jika Anda suka
Ken Gentle
Bisakah Anda menambahkan referensi ke perilaku ini?
Jacco
2

Sementara jawaban di atas akan berfungsi, mereka bukan praktik terbaik. Server svn terbaru dan jalur klien bergabung untuk Anda. Jadi svn tahu revisi mana yang telah Anda gabungkan menjadi cabang dan dari mana. Ini sangat membantu ketika menjaga agar cabang tetap mutakhir dan kemudian menggabungkannya kembali ke bagasi.

Bagaimanapun versi Subversion yang Anda gunakan, ada metode praktik terbaik untuk mendapatkan perubahan di cabang kembali ke bagasi. Itu diuraikan dalam manual Subversion: Kontrol Versi dengan Subversion, Bab 4. Branching and Merging, Keeping a Branch in Sync .


sumber
Terima kasih untuk info resmi sehingga saya bisa menggabungkan cabang ke bagasi dengan pendekatan resmi. Kata kunci adalah reintegrate
Junyo
-3

Ini adalah konfigurasi yang sangat aneh / tidak biasa di SVN, bahkan saya pikir ini jauh dari "praktik yang baik" sama sekali, saya kira Anda dapat melakukan sesuatu seperti:

  • Periksa semua sourcetree (svn co therootsourcetree)
  • Hapus trunk (svn rm trunk)
  • Salin cabang ke trunk (svn cabang cp / cabang / trunk)
  • Hapus cabang (cabang svn rm / cabang)
  • Komit perubahan

Semoga berhasil

Kementeus
sumber
9
Ini menghancurkan jejak sejarah yang akan dipertahankan oleh "svn move".
Rob Williams