SVN cara menyelesaikan konflik pohon baru saat file ditambahkan di dua cabang

95

Saat menggabungkan beberapa cabang (menggunakan SVN 1.6.1) di mana file telah ditambahkan di kedua cabang (dan kemudian bekerja di cabang terpisah tersebut) saya mendapatkan salah satu konflik pohon baru:

      C foo.txt
  >   local obstruction, incoming add upon merge

Saya memerlukan perubahan dari kedua cabang, tetapi konflik pohon tidak memberi saya file .working, .merge-left & .merge-right yang biasa - yang dapat dimengerti karena sifat konflik. Ada cukup banyak konflik ini, dan konflik di mana penghapusan file yang sama telah terjadi di setiap cabang, tetapi mudah diatasi.

Bagaimana cara mengatasi masalah ini? Buku redbean SVN (untuk 1.6) tidak mencakup situasi ini.

DEfusion
sumber

Jawaban:

40

Seperti yang disebutkan dalam versi lama (2009) dari dokumen desain "Konflik Pohon" :

Konflik XFAIL dari gabungan tambah atas file berversi

Tes ini melakukan penggabungan yang membawa penambahan file tanpa riwayat ke file berversi yang ada .
Ini seharusnya menjadi konflik pohon pada file dari local obstruction, incoming add upon mergevarietas ' '. Ekspektasi tetap di r35341.

(Ngomong-ngomong, ini juga disebut "kembar jahat" di ClearCase):
sebuah file dibuat dua kali (di sini "ditambahkan" dua kali) di dua cabang berbeda, membuat dua histori berbeda untuk dua elemen berbeda, tetapi dengan nama yang sama.

Solusi teoretisnya adalah menggabungkan file-file itu secara manual (dengan alat diff eksternal) di cabang tujuan ' B2'.

Jika Anda masih mengerjakan cabang sumber, skenario yang ideal adalah menghapus file itu dari cabang sumber B1, menggabungkan kembali dari B2ke B1untuk membuat file itu terlihat di B1(Anda kemudian akan mengerjakan elemen yang sama).
Jika penggabungan kembali tidak dimungkinkan karena penggabungan hanya terjadi dari B1ke B2, maka penggabungan manual akan diperlukan untuk setiap B1->B2penggabungan.

VonC
sumber
2
Dokumen desain "konflik pohon" adalah link busuk :(
whitey04
4
Lucunya, meskipun kedua file yang ditambahkan sama, mereka tetap muncul sebagai konflik. Ini seharusnya tidak ditandai sebagai konflik.
SantiBailors
1
@SantiBailors Lucu sekali aku sekarat sekarang. Mati untuk teman lamaku git ...
Musim dingin
163

Saya menemukan postingan yang menyarankan solusi untuk itu . Ini akan berjalan:

svn resolve --accept working <YourPath>

yang akan mengklaim file versi lokal sebagai OK.
Anda dapat menjalankannya untuk satu file atau seluruh katalog proyek.

lukmdo
sumber
2
Terima kasih, ini juga menyelesaikan: C foo.txt> add lokal, add masuk setelah update
lazysoundsystem
5
terima kasih itu berhasil untuk saya juga tetapi saya harus melakukan ini: penyelesaian svn - menerima FILENAME yang berfungsi
ajacian81
5
ya, Anda membutuhkan nama file. Ini menerima '.' (direktori saat ini). Saya juga perlu melakukan ini secara rekursif sehingga: "svn resol --accept working --recursive." menyelesaikan semuanya demi salinan pekerjaan Anda (berbahaya! Anda mungkin mengabaikan perubahan orang lain saat Anda melakukan ini, seperti biasa saat menyelesaikan konflik)
Harry Wood
Saya menggunakan alias yang telah saya buat untuk mencantumkan semua file yang mengalami konflik pohon: alias mtc='stat | awk "BEGIN { FS=\" \" } /^.{6}C/ { print \$NF }"' Kemudian saya dapat menggunakan ini sebagai argumen untuk menyelesaikan perintah, seperti ini: svn resolve --accept working $(mtc)
Earl Jenkins
1
Sebenarnya Anda juga perlu menentukan sumber daya misalnya: svn resolve --accept working path/index.html
Tomasz Kuter
9

Bagaimana jika perubahan yang masuk adalah yang Anda inginkan? Saya tidak dapat menjalankan svn resol --accept their-full

svn menyelesaikan - menerima basis

Gabriel FT Gomes
sumber
4
Saya pikir saya telah salah memahami pertanyaan itu. 'base', memang, setara dengan 'theirs-full' saat menggunakan 'svn resol' tetapi tidak menyelesaikan masalah Anda. Yang saya lakukan adalah membaginya menjadi dua bagian: 1) Hapus direktori (atau file) lokal saya yang bentrok, 2) Gabungkan. Ini harus berjalan tanpa konflik, dan karena 'perubahan yang masuk adalah yang Anda inginkan', saya tidak akan peduli dengan item yang dihapus
Gabriel FT Gomes
3

Saya baru saja berhasil meyakinkan diri saya sendiri dengan cukup teliti mencoba mengikuti saran user619330 di atas. Situasinya adalah: (1): Saya telah menambahkan beberapa file saat mengerjakan cabang awal saya, branch1; (2) Saya membuat cabang baru, branch2 untuk pengembangan lebih lanjut, mencabangnya dari trunk dan kemudian menggabungkan perubahan saya dari branch1 (3) Seorang rekan kerja telah menyalin mod saya dari branch1 ke cabangnya sendiri, menambahkan mod lebih lanjut, dan kemudian digabungkan kembali ke bagasi; (4) Sekarang saya ingin menggabungkan perubahan terbaru dari trunk ke cabang saya saat ini, branch2. Ini dengan svn 1.6.17.

Penggabungan memiliki konflik pohon dengan file baru, dan saya ingin versi baru dari trunk di mana mereka berbeda, jadi dari salinan bersih dari branch2, saya melakukan penghapusan svn dari file yang konflik, melakukan perubahan branch2 ini (sehingga membuat sementara versi branch2 tanpa file yang dimaksud), dan kemudian saya menggabungkan dari bagasi. Saya melakukan ini karena saya ingin riwayatnya cocok dengan versi bagasi sehingga saya tidak akan mengalami lebih banyak masalah nanti ketika mencoba menggabungkan kembali ke bagasi. Penggabungan berjalan dengan baik, saya mendapatkan versi batang dari file, svn st menunjukkan semua ok, dan kemudian saya mengalami lebih banyak konflik pohon saat mencoba melakukan perubahan, antara penghapusan yang telah saya lakukan sebelumnya dan penambahan dari penggabungan. Apakah svn menyelesaikan konflik demi copy pekerjaan saya (yang sekarang memiliki versi trunk file), dan membuatnya untuk dikomit.

Tidak. Pembaruan salinan lain dari branch2 menghasilkan file versi lama (pra-trunk merge). Jadi sekarang saya memiliki dua copy pekerjaan berbeda dari branch2, yang seharusnya diperbarui ke versi yang sama, dengan dua versi file yang berbeda, dan keduanya bersikeras bahwa mereka sepenuhnya up-to-date! Memeriksa salinan bersih branch2 menghasilkan versi lama (pra-trunk) file. Saya secara manual memperbarui ini ke versi trunk dan melakukan perubahan, kembali ke copy pekerjaan pertama saya (dari mana saya telah mengirimkan perubahan trunk awalnya), mencoba memperbaruinya, dan sekarang mendapatkan kesalahan checksum pada file yang dimaksud. Hancurkan direktori yang dimaksud, dapatkan versi baru melalui pembaruan, dan akhirnya saya memiliki versi yang bagus dari branch2 dengan perubahan trunk. Saya harap. Pengembang peringatan.

dewtell
sumber