Как я могу поддерживать разные списки игнорирования на разных уровнях папок в Subversion? - PullRequest
2 голосов
/ 06 февраля 2012

Учитывая проект Subversion, где определенные шаблоны всегда должны игнорироваться,

*.log
*.idx

и определенные шаблоны игнорируются только в, например, корне проекта,

*.out

как можноЯ поддерживаю оба списка в одном свойстве svn:ignore?

Чтобы поддерживать список для всего проекта, я бы рекурсивно применял свойство svn:ignore корневой папки всякий раз, когда я его изменял.Но это будет включать шаблоны, которые следует игнорировать только в корне.

Если я не применяю их рекурсивно, тогда другие шаблоны не будут игнорироваться в подпапках.

ОБНОВЛЕНИЕ: Если вы привыкли к Mercurial (как и я), вы можете предложить добавить пути в список игнорирования рута, например

*/*.idx

или

*\*.idx

Ни одна из этих работ не работает для меня в последней Subversion.

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012

В Subversion есть два механизма работы с игнорирующими:

  • Global игнорирует. Шаблон может быть добавлен в список global-ignores в конфигурации Subversion. Применяется глобально ко всем проектам. Вообще говоря, определение слишком большого количества глобальных игнорирований - это плохо.
  • svn:ignore собственность. Установив свойство svn:ignore, можно определить список файлов или папок, которые игнорируются в каталоге, для которого определено это свойство.

И глобальное игнорирование, и свойство svn:ignore работают не с регулярными выражениями, а с использованием шаблонов, соответствующих синтаксису шаблона fnmatch . Который определяет только три типа подстановочных знаков ?, * и []. Вы можете поиграть с ls, чтобы почувствовать, как работают эти паттерны.

Свойства Subversion могут быть установлены рекурсивно. Это будет работать для *.idx и *.log файлов:

$ svn st
? test.log
? test.idx
? recursive/test.log

Создать файл ignores с двумя строками:

*.log
*.idx

Затем установить svn:ingore свойство рекурсивно:

$ svn propset --recursive svn:ignore -F ingores  .
property 'svn:ignore' set on '.'
property 'svn:ignore' set on 'recursive'
$ rm ignores
$ svn st --no-ignores
I test.log
I test.idx
I recursive/test.log

После этого отредактируйте svn:ignore свойство в корне проекта:

$ svn propedit svn:ignore PROJECT_ROOT

и добавьте исключение для шаблона *.out.

Учитывая, что:

Если я не буду применять его рекурсивно, тогда другие шаблоны не будут игнорироваться в подпапках.

Единственный способ - добавить такие шаблоны в глобальное игнорирование.

Некоторые заметки:

  • После установки svn:ignore свойство может быть рекурсивно удалено с помощью помощь svn propdel -R ...
  • Этот способ добавления игнорирований не кажется гибким (для меня). Например, при создании новой папки следует помнить, чтобы установить проект svn:ignore собственность.
  • Рекурсивный набор должен быть сделан рано. Удаляет старое значение устанавливаемого свойства.
  • Главный плюс в том, что игнорируемые значения редактируются редко.
  • Рекурсивное редактирование свойств, кажется, проще, когда это делается с помощью инструментов GUI

Надеюсь, это поможет.

0 голосов
/ 06 февраля 2012

Прочитайте о командах propset и propedit и найдите Одна большая разница

  • propset может быть рекурсивным
  • пропедить не могу

Таким образом, вы можете

  • использовать propset -R в репо-корне с двумя шаблонами всей репо (проверьте результаты, чтобы увидеть, что он заполнен над деревом)
  • с помощью propedit отредактируйте svn-свойства папки только для root и добавьте локальный шаблон игнорирования * .out
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...