Видаліть зайві svn: mergeinfo властивості


136

Коли я зливаю речі у своєму сховищі, Subversion хоче додати / змінити багато svn:mergeinfoвластивостей до файлів, які абсолютно не пов'язані з речами, які я хочу об'єднати.

Питання щодо такої поведінки задавались тут у "Переповнюванні стека":

З того, що я розумію з вищезазначених тем, схоже, що багато файлів у моєму сховищі мають явні svn:mergeinfoвластивості на них, коли вони не повинні. Порада полягає в тому, щоб зменшити кількість і розмістити ці властивості лише у відповідних файлах / папках.

Отже, тепер моє запитання: як я можу легко видалити ці непотрібні властивості? Я використовую TortoiseSVN, але я не хочу вручну перевіряти / виправляти сотні файлів. Чи є простіший спосіб видалити ці непотрібні svn:mergeinfoвластивості?

PS Я не шукаю код C ++ SVN API.

Відповіді:


142

Ось ще один спосіб видалити всі subn svv: властивості mergeinfo, але не в кореневій папці (це потрібно для того, щоб розгалуження працювало належним чином).

З кореня проекту зробіть:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"

57
Або просто не робіть цього в кореневому режимі "svn propdel -R svn: mergeinfo ./*"
JeremyWeir

3
"svn propdel -R svn: mergeinfo ./* ./. evidence^.ember*", якщо у вас також є "dot" / * ix приховані файли, ймовірно, це не проблема для користувача Windows за запитання.
Петро

3
придушення виведення прискорює його: "svn propdel svn: mergeinfo -R> nul" (або> / dev / null за допомогою Linux)
bebbo

2
@JeremyWeir Що ви маєте на увазі під «просто не робити цього на кореневому режимі»? Звідки тоді? У вас є багато відгуків на цей коментар, але я не бачу альтернативи.
ТТ.

3
@TT. Я думаю, що ідея полягає в тому, щоб просто перейти до dir, у якого є вся змішана інформація про злиття, і зробити це звідти, так що вам не доведеться повертати кореневий каталог. Ви не хочете возитися з об'єднанням кореня.
JeremyWeir

15

Ось спосіб видалити всі subtree svn: mergeinfo властивості. Запустіть його всередині кореня вашого сховища:

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

Все в одному рядку для простого копіювання / вставки:

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

Щоб переглянути, які файли будуть діяти перед запуском, змініть останній "propdel" на "propget" або видаліть останню трубку xargs.


2
Працює з дефісами у файлах: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." | вирізати "-d" -f1 | xargs svn propdel svn: mergeinfo
Білка

12

Як згадується в цій темі :

  • Більшість порожніх даних mergeinfo ("порожнє") може бути спричинене робочою копією до робочої копії копії / переміщення, коли вихідний елемент не має явного об'єднання. Використання propdel може бути вирішенням, якщо ви не використовуєте 1.6 SVN: оскільки 1.5.5 ці копії WC-to WC більше не створюють порожні об’єкти злиття у пункті призначення
  • попередня операція реструктуризації svn переміщення (перейменування) також може поширювати mergeinfo, а не залишати їх у кореневому каталозі
  • є потенційна проблема пам’яті, відстежена випадком 3393, який буде виправлено у майбутній версії 1.6.2 та повернено назад у 1.5

6

Оскільки я не впевнений у сліпому svn:merge-infoвидаленні властивостей, я застосував інструмент для аналізу поточної ситуації на робочій копії та видалення якомога більшої кількості ревізій злиття з некореневих властивостей злиття інформації. Після додаткових перевірок і контролю людини зміни на робочій копії можуть бути здійснені.

Ось це: svn-clean-mergeinfo

Не соромтеся повідомляти про будь-які проблеми щодо його використання, щоб покращити його.

Subversion 1.10 вводить новий інструмент, присвячений цій задачі: svn-mergeinfo-normalizer


2
Цей інструмент відмінно підходить для консолідації властивостей інформації про злиття, як і такі види, які створюються за допомогою часткових з’єднань підкаталогів, які можуть створювати багато менш, ніж ідеально узгоджені розробники у великій команді. Здається, в інструменті є проблеми з файлами, які не існують у кожній гілці, я отримую властивості залишкової інформації злиття у файлах, що вказують на ревізії гілок, у яких файл ніколи не існував.
davenpcj

Я погоджуюсь, що це не досконало ... саме тому "перевірки та контроль людини" все ще потрібні. У вашому випадку, якщо ви виявили невідповідні редакції у властивостях злиття інформації, ви можете видалити ці редакції або все властивість svn: merge-info з цих файлів перед тим, як зробити це. Будь ласка, використовуйте github, щоб запитати про покращення.
Ів Мартін

4

Я знаю, що минув час, але я зіткнувся з подібною проблемою. Я використовую TortoiseSVN 1.6.7. Так сталося, що майно було в корені моєї робочої копії. Коли я переглянув властивості в корені і натиснув Видалити на svn: mergeinfo, він запитав мене, чи хочу я його видаляти рекурсивно. Це позбулося всіх моїх svn: mergeinfo cockups.


Я опинився в тій же ситуації. Працювали для мене. Дякую!
andrewd18

2

Якщо ви впевнені, що хочете масово видалити властивості злиття інформації, ви можете скористатись наступним сценарієм BASH.

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

Він отримує список змінених файлів, відфільтровує його, щоб лише об'єднати лише зміни, знімає все, окрім фактичного шляху до файлу, перетворює контури одного рядка в список з обмеженим пробілом, а виклики повертаються до цього списку.


2
Дякую, але, як ви, можливо, мені знали, що згадую TortoiseSVN, я користувач Windows і не використовую оболонку Bash :-)
LeonZandman

Те ж саме повинно бути можливим і в DOS, хоча, ймовірно, не так коротко.
Чейз Сейберт

1
Це не повертає лише файли із зміненою інформацією об'єднання в поточному робочому каталозі? Якщо це так, це не вирішує проблему: наявне явне об'єднання інформації. Для цього вам потрібно буде пропольдувати.
Домінік Шейрлінк

2
Це досить баггі - мати ім’я файлу з пробілом у своєму імені? З глобусними символами в своїй назві? Погані новини в будь-якому випадку. Затверджений / підтримуваний спосіб розбору результатів зі статусу svn - це використання --xmlпрапора та аналізатора XML; все інше може змінюватися між версіями, оскільки сумісність форвардів у форматному тексті виводу не гарантується.
Чарльз Даффі

2

Замість того, щоб просто сліпо видалити властивості злиття інформації, можна також виконати "відсутні" злиття.

Скопіюйте властивість mergeinfo з кореневої папки, а потім виконайте злиття в дочірній папці для відповідного відносного шляху та такого ж списку версій. (Ви можете, але не потрібно, лише перелічити відмінності між цим списком та тим, що вже є у дочірній папці.)

Зазвичай це злиття має закінчуватися лише зміною властивостей об'єднання інформації, а не будь-якими фактичними файлами. (Якщо в кінцевому підсумку змінюються файли, то одне з попередніх об'єднань повинно бути лише частковим злиттям, яке, можливо, спричинило вам проблеми.)

Для цього слід видалити для вас властивість mergeinfo, як тільки ви отримаєте їх обоє, щоб вони точно відповідали. Також вам може знадобитися зробити зворотне: об'єднати в корінь будь-які зміни злиття, наявні лише в дочірній папці (знову ж, ви можете просто вставити повний список і дозволити SVN розбиратися, знаходячи для вас відмінності).


1

Щоб змінити структуру каталогів, це було б (лише для "пошуку" не для DOS):

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

Запуск клієнта 1.6.12, підключеного до сервера 1.5, у мене є аналогічна проблема; там є підкаталог в проекті , який потребує в його власний SVN: mergeinfo, але з 121 таких записів ( в тому числі 5 каталогів нижче ./var з «SVN: ігнорувати *») здається трохи недоречним. Таким чином, було б непогано мати (наприклад, Python) скрипт, який здатний видалити очевидно зайву інформацію про злиття та розповісти про інші відмінності ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.