2009-04-20 4 views
128

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

Вопросы такого поведения было предложено до здесь на переполнение стека:

Из того, что я понял из тем, упомянутых выше, похоже, у большого количества файлов в моем репозитории есть явные svn:mergeinfo свойства на них, когда они не должны. Совет состоит в том, чтобы уменьшить количество и только поместить эти свойства в соответствующие файлы/папки.

Итак, теперь мой вопрос: как я могу легко удалить те ненужные свойства? Я использую TortoiseSVN, но я не хочу вручную проверять/исправлять сотни файлов. Есть ли более простой способ удалить ненужные объекты svn:mergeinfo?

P.S. Я не ищет код API SVN C++.

ответ

12

Как уже упоминалось в this thread:

  • Наиболее пустой mergeinfo («пустой») может быть вызвано рабочей копии работать копии копий/движения, где элемент источника не имеет никакого явного mergeinfo. Использование propdel может быть решением, если вы не используете 1.6 SVN: поскольку 1.5.5 эти копии WC-to-WC больше не создают пустой mergeinfo для адресата
  • ранее проведенная операция реструктуризации svn move (rename) также может распространять mergeinfo, вместо того, чтобы оставить их в корневой каталог
  • существует потенциальная проблема памяти, отслеживаются case 3393 которая будет исправлена ​​в следующей версии 1.6.2 и обратно портирована в 1,5
2

Если вы уверены, хотите массово удалить свойства mergeinfo, вы можете использовать следующий сценарий BASH.

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

Он получает список измененных файлов, фильтрует его просто mergeinfo только изменений, полосы все, но реальный путь файла, преобразует пути один-за-линии в пространстве разделителей в список, и звонки возвращаются на этот список.

+2

Thanx, но, как вы, возможно, знали из меня, что упоминание TortoiseSVN Я пользователь Windows и не использую оболочку Bash :-) – LeonZandman

+0

То же самое должно быть возможно в DOS, хотя, вероятно, не так уж и кратким. –

+1

Не решает ли это только файлы с измененным mergeinfo в текущем рабочем каталоге? Если это так, проблема не решена: существующий явный mergeinfo. Для этого вам нужно пропелировать. –

13

Здесь можно удалить все свойства svn 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 «to propget» или вообще удалить последнюю трубку xargs.

+2

Работает с дефисами в файлах: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \". | cut "-d" -f1 | xargs svn propdel svn: mergeinfo – Squirrel

2

Я знаю, что это было какое-то время, но у меня возникла аналогичная проблема. Я использую TortoiseSVN 1.6.7. Так получилось, что собственность была в корне моей рабочей копии.Когда я просмотрел свойства в корне и нажал «Удалить» на svn: mergeinfo, он спросил меня, хочу ли я удалить его рекурсивно. Это избавило меня от всех моих svn: mergeinfo cockups.

+0

Я был в той же ситуации. Работал для меня. Благодаря! – andrewd18

131

Вот еще один способ, чтобы удалить все суб дерево SVN: свойства mergeinfo, но не в корневой папке (это необходимо для разветвления, чтобы работать должным образом).

От корня проекта сделать:

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

Или просто не делайте этого на корневом каталоге "svn propdel -R svn: mergeinfo ./*" – JeremyWeir

+2

"svn propdel -R svn: mergeinfo ./* ./.[^.]*" если у вас также есть «dot»/* ix скрытые файлы, вероятно, не проблема для пользователя Windows в вопросе. – Peter

+3

подавление выходных скоростей: «svn propdel svn: mergeinfo -R> nul» (или>/dev/null с использованием Linux) – bebbo

1

Для изменения в структуре каталогов, это будет (не DOS 'найти' только):

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

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

4

Как я не уверен в слепых svn:merge-info Исключение собственности, я внедрил инструмент для анализа текущей ситуации на рабочей копии и удаления как можно большего количества изменений из свойств non-root merge-info. После дополнительных проверок и контроля людей изменения в рабочей копии могут быть совершены.

Здесь: svn-clean-mergeinfo

Не стесняйтесь сообщать любой вопрос о его использовании, чтобы получить его улучшилось.

Subversion 1,10 вводит новый инструмент, посвященный этой задачи: svn-mergeinfo-normalizer

+1

Этот инструмент отлично подходит для консолидации свойств merge-info, таких как типы, которые создаются с использованием частичного подкаталога, которые могут создавать многие менее совершенные координированные разработчики из большой команды. У инструмента, похоже, есть проблема с файлами, которые не существуют в каждой ветви, я получаю оставшиеся свойства merge-info в файлах, указывающих изменения в ветвях, в которых файл никогда не существовал. – davenpcj

+0

Я согласен, что это не идеально ... вот почему «человеческие проверки и контроль» по-прежнему требуются. В вашем случае, если вы указали не релевантные изменения в свойствах merge-info, вы можете удалить эти изменения или все свойство svn: merge-info в этих файлах перед фиксацией. Пожалуйста, используйте github, чтобы попросить улучшения. –

2

, а не просто слепо удалить свойства mergeinfo, это также можно завершить «недостающие» слияния.

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

Обычно это слияние должно только изменять свойства mergeinfo, а не фактические файлы. (Если это в конечном итоге меняет файлы, то одно из предыдущих слияний должно быть только частичным слиянием, которое, возможно, вызывало у вас проблемы).

Выполнение этого должно привести к удалению свойства mergeinfo для вас один раз вы получили их обоих, чтобы точно соответствовать. Вам также может потребоваться сделать обратное: объединить в корень любые изменения слияния, только присутствующие в дочерней папке (опять же, вы можете просто вставить полный список и позволить SVN разобраться в обнаружении различий для вас).

Смежные вопросы