SVN: рекурсивно игнорировать некоторые каталоги


106

Я не хочу, чтобы какой-либо каталог с именем buildили distвходил в мой SVN, независимо от того, насколько глубоко он в дереве.

Это возможно? В git я просто поставил

build
dist

в моем .gitignoreкорне, и он рекурсивно игнорирует. Как мне сделать это с помощью svn? Пожалуйста, не говорите мне делать пропсет для каждого родительского каталога ...


Проверьте этот ответ на собственное решение, если вы используете Subversion 1.8.
Фрэнк Кастерс,

Ответы:


57

Начиная с Subversion 1.8, теперь есть svn:global-ignoresсвойство, которое работает как, svn:ignoreно рекурсивно (поэтому установите его в своем каталоге верхнего уровня)


3
Я немного запутался - global-ignoresв ~/.subversion/configфайле есть наследуемые svn:global-ignores свойства, установленные в каталоге в репозитории SVN, а также svn:ignore- можете ли вы предоставить сводку этих различных вариантов и их сравнение? Как на --recursiveних влияет флаг?
Дай

2
Я провел собственное исследование и опубликовал свои выводы в этом ответе на QA: stackoverflow.com/a/86052/159145
Дай,

[Я пробовал, но не смог, objпапка все еще появилась] ( stackoverflow.com/questions/50960188/… ), не могли бы вы помочь мне взглянуть на нее?
Люк

Могу ли я сказать "build / *" игнорировать все, что находится ниже build, в каждой папке сборки?
Йоханнес Шауб - лит

45

svn propsetпринимает --recursiveкак вариант, поэтому вы можете сделать это, но с двумя недостатками:

  1. вам нужно проверить весь репозиторий (или, по крайней мере, все его каталоги), и
  2. вы должны не забывать устанавливать svn:ignoreсвойство всякий раз, когда вы добавляете новый каталог

42

Это невозможно сделать. В Subversion есть только два механизма игнорирования svn:ignore(нерекурсивный) и global-ignores(который не является специфическим для репозитория).


7
svn propset --recursive svn: игнорировать svn_ignore_rules. где svn_ignore_rules - это файл, содержащий правила игнорирования - по одному в строке
georg

3
'svn propset --recursive svn: ignore --file svn_ignore_rules.' для меня с svn-1.7.6, иначе вы рекурсивно игнорируете файлы с именем 'svn_ignore_rules' [редактировать: согласно 'wytten' в комментарии ниже]
elbeardmorez

9
Комментаторам: Как сказал спрашивающий: «Пожалуйста, не говорите мне делать пропсет для каждого родительского каталога ...».
Кевин Рид

5
Теперь это возможно в Subversion 1.8
Squirrel

17

Это работает для меня:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>

2
Спасибо за это, отлично работает ... Кстати, я обнаружил, что единственный способ игнорировать и * .txt, и * .pdf - это поместить эти шаблоны в файл, а затем использовать параметр 'svn propset --file'
wytten

13

добавьте в ваш файл ~ / .subversion / config или / etc / subversion / config:

[miscellany]
global-ignores = build dist

Я бы предпочел делать это на репо, если могу
Пол Тарджан

1
хм, не уверен, есть ли простой способ сделать это для каждого репо, хук предварительной фиксации может отклонить определенные шаблоны, но это не полное решение. svn: ignore для каждого родительского каталога работает, но не рекурсивно. вы можете заменить свой файл конфигурации скриптом при работе с разными репозиториями, но это дополнительный шаг.
jspcal

1
Что означает build dist ?
Игорь Ганапольский

9

Можно игнорировать каталоги build и dist, удалив каталоги из системы контроля версий. Уловка заключается в том, чтобы использовать параметр --keep-local, чтобы оставить каталог в рабочей копии. Например:

svn rm dist --keep-local
svn ci -m'removed build directory from version control'

Каталог больше не будет отслеживаться Subversion, но он по-прежнему будет в вашей рабочей копии для хранения вывода компилятора и т. Д.

ура, Джо


7

Например, структура папок:

Project/
Project/dist/

cd Project
svn propset svn:ignore '*' dist/
svn ci -m "content of dist ignored"

Перед командой ignore рекомендуется удалить содержимое dist с помощью svn, поэтому для веток dist будет пустым.

Сработало у меня, сегодня протестировал. Вот страница, на которой это немного объясняется


6

Чтобы игнорировать все такие файлы во всех репозиториях, вы можете добавить в global-ignoresфайл конфигурации для каждого пользователя.

В Unix-подобных системах эта область отображается как каталог с именем .subversion в домашнем каталоге пользователя. В системах Win32 Subversion создает папку с именем Subversion, обычно в области данных приложения каталога профиля пользователя.

См. Параметры конфигурации

К сожалению, для этого нет возможности для каждого репозитория. Это в основном для каждого пользователя или для каталога, поэтому svn:ignores, вероятно, множественный способ - это как можно больше раздражает.


1
Я бы предпочел делать это на репо, если смогу
Пол Тарджан

О, тогда тебе не повезло. Как говорит @Kevin Reid - у вас есть каталог или пользователя.
Блэр Конрад,

6

Сначала вам нужно перейти в верхнюю папку вашей рабочей копии и создать там файл (скажем .svnignore), где вы должны разместить все шаблоны, которые вы хотите игнорировать, например (для проекта Android):

bin
gen
proguard
.classpath
.project
local.properties
Thumbs.db
*.apk
*.ap_
*.class
*.dex

Затем вы запускаете следующую команду (помните, что вы должны находиться в верхней папке вашей рабочей копии):

svn propset svn:ignore -R -F .svnignore .

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

svn rm --keep-local <path>

Все это почерпнуто из этой замечательной статьи, которая все объясняет: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/


Это было очень полезно. Это лучший способ получить игнорирование в svn в стиле git. Огромное спасибо.
Джонатан Уилсон

6

В более поздней версии Subversion 1.8 можно установить глобальное игнорирование для текущего репозитория.

svn propset svn:global-ignores build .
svn propset svn:global-ignores dist .

Также вы можете создать папку с именем .svnignore и записать условия.

build
dist

помните одно условие на строку, установка build / * или dist / debug напрасна. Затем выполните команду:

svn propset svn:global-ignores -F .svnignore .

работает безотказно! просто запустите первую команду в только что полученном репо.
Gaurav

3

Создайте файл и добавьте в него свои игнорирования

список ингредиентов:

file1 
directory1
file2
etc...

затем примените следующую команду

for n in directory; do svn propset svn:ignore -F ignore-list $n; done

directory - это имя вашего каталога, вы также можете разделить на подкатегории каталог / подкаталог. Или используйте *, чтобы отметить текущий каталог, в котором вы находитесь.

Предполагается, что вы используете bash в качестве оболочки


Что здесь за $ n ?
Игорь Ганапольский

1
@igor Ganapolsky - $ n - это переменная цикла for. Он будет установлен как индекс для последовательности, в которую вы зацикливаетесь; в данном случае это каталог, указанный как «каталог» в приведенном выше примере.
jncc99

3
svn propset --recursive svn:ignore svn_ignore_rules .

где svn_ignore_rules - это файл, содержащий правила игнорирования - по одному на строку

Конечно, вам нужно повторно запускать его каждый раз, когда вы добавляете новый каталог в свое репо.

svn_ignore_rules также можно считать зарегистрированным в репо, чтобы его могли повторно использовать другие пользователи, имеющие доступ на запись в репо.


2
cd parent_dir # каталог, содержащий папку, которую нужно рекурсивно игнорировать
svn propedit svn: ignore. # откроется svn-prop.tmp
зачислить папку (и)
^ X
Y
commit -m 'игнорировать целевую директиву'

помогло мне, у меня была проблема с настройкой шаблона папки, SVN соответствовал этой папке не в репо set EDITOR=notepad, svn propedit svn:ignore .работал хорошо ...
Betlista

1

Поскольку, похоже, нет решения этой, вероятно, распространенной проблемы, я хотел бы поделиться нашим решением. Как уже пояснили другие, вы можете либо использовать svn:ignoreсвойство, это применимо к одному каталогу (и, следовательно, не к новым), либо вы можете использовать свойство, global-ignoresкоторое применяется к одному пользователю (но не принадлежит репозиторию).

Чтобы немного облегчить жизнь, я создал файл reg с именем Settings.Svn.regи добавил его в корень репозитория. Теперь каждый может дважды щелкнуть этот reg-файл один раз, и настройки будут выполнены.

REGEDIT4

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"global-ignores"="obj *.suo *.bak *.pdb *.user *.Cache*"

Я был бы очень признателен за решение в репозитории SVN, поэтому, если кто-то знает, не могли бы вы поделиться им?


0

Одним из способов было бы добавить какую-то проверку к ловушке до или после фиксации, но это сразу следует отметить, если вы не владеете сервером репо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.