Gabungkan Cabang menjadi Batang

125

Saya menghadapi masalah aneh dengan SVN merge. Saya ingin bergabung dari cabang dev ke trunk. Kami memiliki beberapa cabang dev memotong batang pada saat yang bersamaan.

Saya menggabungkan salah satu cabang untuk trunk dengan perintah ini:

svn merge trunk branch_1

Saya melihat perubahan yang bukan bagian dari cabang ini, digabung menjadi trunk. Apa yang saya lakukan salah?

Versi SVN:

Klien baris perintah Subversion, versi 1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32.

Vanchinathan Chandrasekaran
sumber
7
Saya tahu ini bukan jawaban, tetapi jika Anda memiliki beberapa cabang aktif secara bersamaan, maka mungkin Anda sebaiknya pindah ke mercurial atau git. Ps: Saya bukan fanatik, saya telah bekerja dengan svn selama ~ 7 tahun ;-)
zerkms
2
Apa manfaatnya? Mengapa pindah ke git atau lincah adalah pilihan yang lebih baik?
Vanchinathan Chandrasekaran
3
karena git dan mercurial memiliki dukungan cabang yang jauh lebih baik . Keuntungan: Anda tidak akan mengajukan pertanyaan seperti itu dan tidak akan terlalu pusing membuat dan memelihara cabang (saat ini saya sedang bekerja di proyek dengan> 1000 cabang, di svn itu adalah neraka untuk bekerja dengan mereka)
zerkms
Saya sarankan melihat ke Svnmerge.py dan meninjau artikel ini .
chown

Jawaban:

215

svn mergeSintaks Anda salah.

Anda ingin checkout salinan kerja trunkdan kemudian gunakan svn merge --reintegrateopsi:

$ pwd
/home/user/project-trunk

$ svn update  # (make sure the working copy is up to date)
At revision <N>.

$ svn merge --reintegrate ^/project/branches/branch_1
--- Merging differences between repository URLs into '.':
U    foo.c
U    bar.c
 U   .

$ # build, test, verify, ...

$ svn commit -m "Merge branch_1 back into trunk!"
Sending        .
Sending        foo.c
Sending        bar.c
Transmitting file data ..
Committed revision <N+1>.

Lihat bab buku SVN tentang penggabungan untuk lebih jelasnya.


Perhatikan bahwa pada saat ditulis, ini adalah jawaban yang tepat (dan diterima), tetapi banyak hal telah berubah. Lihat jawaban topek, dan http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate

blahdiblah
sumber
4
- opsi reintegrate tidak wajib, cabang (dalam 1.6) dapat digabungkan dengan tujuan apa pun beberapa kali
Lazy Badger
1
Betulkah? Tanpa mengambil risiko membuat ulang perubahan yang sama? Bisakah Anda memberikan tautan ke bukti yang menguatkan ini?
Neutrino
--reintegratememang tidak wajib tetapi sangat direkomendasikan dalam hal ini. Saya telah mencoba melakukannya tanpa --reintegratedan berakhir dengan ratusan konflik. Dengan --reintegrate, tidak ada konflik dan semuanya baik-baik saja!
tibo
17
The --reintegratepilihan adalah sederhana dan efektif, tetapi harus dicatat bahwa "Setelah --reintegrategabungan dilakukan dari cabang ke batang, cabang tidak lagi digunakan untuk bekerja lebih lanjut. Ini tidak dapat benar menyerap perubahan batang baru, juga tidak dapat diintegrasikan kembali benar untuk trunk lagi. " seperti yang dijelaskan oleh buku yang telah Anda tautkan.
Pino
3
@ DaveL, meneruskan penggabungan dari trunk ke branch masuk akal bagi saya. Namun saya telah menemukan fitur lanjutan untuk "menjaga cabang yang diregitrasi tetap hidup" (lihat stackoverflow.com/a/10163059/685806 ), dan selanjutnya diterapkan secara otomatis oleh versi klien yang lebih baru.
Pino
78

Jika direktori kerja Anda menunjuk ke trunk, maka Anda harus dapat menggabungkan cabang Anda dengan:

svn merge https://HOST/repository/branches/branch_1

pastikan untuk mengeluarkan perintah ini di direktori root dari trunk Anda

topek
sumber
7
Pada SVN 1.8. Ini adalah jawaban yang benar. Lihat subversion.apache.org/docs/release-notes/…
GreenAsJade
@blahdiblah cuplikan kode memiliki banyak info asing. Ada alasan mengapa abstrak studi bisa membaca urutan besarnya lebih dari bagian lain dari studi. Hal yang sama berlaku untuk pengujian UX, meminimalkan rasio pentalan, dll. Semuanya adalah prinsip yang sama.
ahnbizcad
dengan 1.7 Anda bisa bergabung tanpa opsi --reintegrate, dan terus berkembang di cabang dan terus bergabung. Sayangnya, 1,8 akan memaksa ini menjadi reintegrasi, dan sepertinya tidak ada cara untuk mencegahnya. Ini berarti begitu Anda bergabung, Anda tidak dapat menggunakan cabang tanpa melalui "tarian tetap hidup" yang ditakuti
John Little
3
Jangan lupa untuk kemudian mengkomit copy pekerjaan trunk kembali ke repositori setelah penggabungan!
John
16

Lakukan pembaruan svn di bagasi, catat nomor revisi.

Dari bagasi:

svn merge -r<revision where branch was cut>:<revision of trunk> svn://path/to/branch/branchName

Anda dapat memeriksa di mana cabang dipotong dari bagasi dengan melakukan log svn

svn log --stop-on-copy
Mike K.
sumber
Karena ada beberapa cabang dev yang hidup pada saat yang sama, ini juga tidak berfungsi untuk saya, perintah ini menarik perubahan dari cabang lain juga. Mungkin ini masalah dengan klien SLik SVN?
Vanchinathan Chandrasekaran
Meskipun ini tidak akurat, ada cara yang lebih mudah untuk bergabung dengan versi yang lebih baru svn(seperti yang digunakan OP).
blahdiblah
@VanchinathanChandrasekaran, dalam perintah Anda tentukan nama cabang karena svn://path/to/branch/branchNameitu harus menarik hanya perubahan dari cabang itu bukan dari cabang lainnya. Jika demikian kita berada dalam bahaya!
Fredrick Gauss
1

Sintaksnya salah, seharusnya itu yang terjadi

svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>
lwpro2
sumber