Hapus properti svn: mergeinfo yang tidak perlu

136

Ketika saya menggabungkan barang-barang di repositori saya, Subversion ingin menambah / mengubah banyak svn:mergeinfoproperti ke file yang sama sekali tidak terkait dengan hal-hal yang ingin saya gabungkan.

Pertanyaan tentang perilaku ini telah ditanyakan sebelumnya di sini di Stack Overflow:

Dari apa yang saya pahami dari topik yang disebutkan di atas, sepertinya banyak file di repositori saya memiliki svn:mergeinfoproperti eksplisit , padahal seharusnya tidak. Sarannya adalah kurangi jumlah dan hanya letakkan properti tersebut di file / folder yang relevan.

Jadi sekarang pertanyaan saya: bagaimana saya bisa dengan mudah menghapus properti yang tidak dibutuhkan itu? Saya menggunakan TortoiseSVN, tetapi saya enggan untuk memeriksa / memperbaiki ratusan file secara manual. Apakah ada cara yang lebih mudah untuk menghapus svn:mergeinfoproperti yang tidak diperlukan tersebut ?

PS Saya tidak mencari kode C ++ SVN API.

LeonZandman
sumber

Jawaban:

142

Berikut adalah cara lain untuk menghapus semua sub pohon svn: properti mergeinfo tetapi tidak di folder root (ini diperlukan agar percabangan berfungsi dengan baik).

Dari root proyek lakukan:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
Vincent
sumber
57
Atau, jangan lakukan itu di root dir "svn propdel -R svn: mergeinfo ./*"
JeremyWeir
3
"svn propdel -R svn: mergeinfo ./* ./.[^.]*" jika Anda juga memiliki "dot" / * ix file tersembunyi, mungkin bukan masalah bagi pengguna Windows per pertanyaan tersebut.
Peter
3
menekan keluaran mempercepatnya: "svn propdel svn: mergeinfo -R> nul" (atau> / dev / null menggunakan Linux)
bebbo
2
@JeremyWeir Apa yang Anda maksud dengan "jangan lakukan itu di root dir"? Dari mana kemudian? Anda mendapatkan banyak suara positif untuk komentar itu, tetapi saya tidak melihat alternatifnya.
TT.
3
@TT. Saya pikir idenya adalah hanya pergi ke dir yang memiliki semua info penggabungan yang kacau dan melakukannya dari sana, jadi Anda tidak perlu mengembalikan direktori root. Anda tidak ingin mengacaukan mergeinfo dari root.
JeremyWeir
15

Berikut adalah cara untuk menghapus semua subpohon svn: properti mergeinfo. Jalankan di dalam root repositori Anda:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

Semua dalam satu baris agar mudah menyalin / menempel:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

Untuk melihat file mana yang akan berpengaruh sebelum Anda menjalankannya, ubah "propdel" terakhir menjadi "propget" atau hapus pipa xargs terakhir sama sekali.

Kelvin
sumber
2
Berfungsi dengan tanda hubung di file: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." | potong "-d" -f1 | xargs svn propdel svn: mergeinfo
Squirrel
12

Seperti yang disebutkan di utas ini :

  • Kebanyakan mergeinfo kosong ("blank") dapat disebabkan oleh copy pekerjaan ke copy pekerjaan / pemindahan dimana item sumber tidak memiliki mergeinfo eksplisit. Menggunakan propdel bisa menjadi solusinya kecuali Anda menggunakan SVN 1.6: karena 1.5.5 salinan WC-ke-WC ini tidak lagi membuat mergeinfo kosong di tujuan
  • operasi restrukturisasi pemindahan svn sebelumnya (ganti nama) juga dapat menyebarkan mergeinfo, alih-alih meninggalkannya di direktori root
  • ada masalah memori potensial, dilacak berdasarkan kasus 3393 yang akan diperbaiki dalam versi 1.6.2 mendatang dan di-porting kembali di 1.5
VonC
sumber
6

Seperti saya tidak percaya diri dengan buta svn:merge-info penghapusan properti , saya telah menerapkan alat untuk menganalisis situasi saat ini pada copy pekerjaan dan menghapus sebanyak mungkin revisi gabungan dari properti info gabungan non-root. Setelah pemeriksaan dan kontrol tambahan oleh manusia, perubahan pada copy pekerjaan dapat dilakukan.

Ini dia: svn-clean-mergeinfo

Jangan ragu untuk melaporkan masalah apa pun tentang penggunaannya untuk memperbaikinya.

Subversion 1.10 memperkenalkan alat baru yang didedikasikan untuk tugas itu: svn-mergeinfo-normalizer

Yves Martin
sumber
2
Alat ini sangat bagus untuk menggabungkan properti info gabungan, seperti jenis yang dibuat dengan penggabungan subdirektori parsial yang mungkin dibuat oleh banyak pengembang yang kurang terkoordinasi dengan sempurna dalam tim besar. Alat tampaknya memiliki masalah dengan file yang tidak ada di setiap cabang, saya mendapatkan properti info gabungan yang tersisa pada file yang menunjukkan revisi pada cabang di mana file tersebut tidak pernah ada.
davenpcj
Saya setuju itu tidak sempurna ... itulah mengapa "pemeriksaan dan kontrol manusia" masih diperlukan. Dalam kasus Anda, jika Anda telah mengidentifikasi revisi yang tidak relevan di properti info gabungan, Anda dapat menghapus revisi ini atau seluruh properti svn: merge-info pada file itu sebelum melakukan. Silakan gunakan github untuk meminta perbaikan.
Yves Martin
4

Saya tahu ini sudah lama, tetapi saya mengalami masalah serupa. Saya menggunakan TortoiseSVN 1.6.7. Kebetulan properti itu ada di root copy pekerjaan saya. Ketika saya melihat properti di root dan mengklik Hapus di svn: mergeinfo, saya ditanya apakah saya ingin menghapusnya secara rekursif. Ini menyingkirkan semua svn saya: mergeinfo cockups.

moribvndvs
sumber
Saya berada dalam situasi yang sama. Bekerja untuk saya. Terima kasih!
andrewd18
2

Jika Anda yakin ingin menghapus properti mergeinfo secara massal, Anda dapat menggunakan skrip BASH berikut.

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

Itu mendapat daftar file yang diubah, memfilternya untuk hanya menggabungkan perubahan saja, menghapus semuanya kecuali jalur file yang sebenarnya, mengubah jalur satu per baris menjadi daftar yang dipisahkan spasi, dan panggilan kembali ke daftar itu.

Chase Seibert
sumber
2
Terima kasih, tetapi seperti yang Anda ketahui dari saya menyebutkan TortoiseSVN Saya adalah pengguna Windows dan tidak menggunakan Bash shell :-)
LeonZandman
Hal yang sama harus dimungkinkan di DOS, meskipun mungkin tidak sesingkat itu.
Chase Seibert
1
Bukankah ini hanya mengembalikan file dengan mergeinfo yang dimodifikasi pada direktori kerja saat ini? Jika demikian, ini tidak mengatasi masalah: mergeinfo eksplisit yang ada. Untuk itu, Anda perlu mendorong.
Dominic Scheirlinck
2
Ini cukup bermasalah - punya nama file dengan spasi pada namanya? Dengan karakter glob dalam namanya? Kabar buruk dalam kedua kasus tersebut. Cara yang disetujui / didukung untuk mengurai keluaran dari status svn menggunakan --xmlbendera dan parser XML; apa pun dapat berubah di antara versi, karena kompatibilitas ke depan pada format keluaran tekstual tidak dijamin.
Charles Duffy
2

Daripada hanya menghapus properti mergeinfo secara membabi buta, itu juga memungkinkan untuk menyelesaikan gabungan yang "hilang".

Salin properti mergeinfo dari folder akar, dan kemudian lakukan penggabungan pada folder anak untuk jalur relatif yang sesuai dan daftar revisi yang sama persis. (Anda dapat, tetapi tidak perlu, hanya mencantumkan perbedaan antara daftar ini dan yang sudah ada di folder anak.)

Biasanya penggabungan ini hanya akan mengubah properti mergeinfo, bukan file sebenarnya. (Jika itu akhirnya mengubah file, maka salah satu dari gabungan sebelumnya pasti hanya gabungan sebagian, yang mungkin menyebabkan masalah bagi Anda.)

Melakukan hal ini pada akhirnya akan menghapus properti mergeinfo untuk Anda, setelah Anda membuat keduanya sama persis. Anda mungkin juga perlu melakukan kebalikannya: gabungkan ke root revisi gabungan apa pun yang hanya ada di folder anak (sekali lagi, Anda bisa menempelkan daftar lengkap dan biarkan SVN memilah-milah menemukan perbedaan untuk Anda).

Miral
sumber
1

Untuk melakukan perubahan dalam struktur direktori, ini akan menjadi (hanya 'temukan' non-DOS):

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

Menjalankan klien 1.6.12 yang terhubung ke server 1.5, saya memiliki masalah yang sama; ada adalah subdirektori dalam proyek yang membutuhkan svn sendiri: mergeinfo, tetapi memiliki 121 entri tersebut (termasuk 5 direktori bawah ./var dengan "svn: ignore *") tampaknya agak tidak pantas. Jadi, alangkah baiknya memiliki skrip (misalnya Python) yang mampu menghapus info penggabungan yang jelas tidak berguna dan memberi tahu tentang perbedaan lainnya ...

Tobias
sumber