(Этот ответ был обновлен в соответствии с поведением SVN 1.8 и 1.9)
У вас есть 2 вопроса:
Пометка файлов как проигнорированных:
Под "игнорируемым файлом" я подразумеваю, что файл не будет отображаться в списках даже как "неверсированный": ваш SVN-клиент сделает вид, что файл вообще не существует в файловой системе.
Игнорируемые файлы указываются «шаблоном файла». Синтаксис и формат шаблонов файлов объясняется в онлайн-документации SVN: http://svnbook.red -bean.com / nightly / en / svn.advanced.props.special.ignore.html"Шаблоны файлов в Subversion".
Subversion, начиная с версии 1.8 (июнь 2013 г.) и более поздних, поддерживает 3 различных способа задания шаблонов файлов. Вот резюме с примерами:
1 - Область конфигурации времени выполнения - global-ignores
опция:
- Это настройка только на стороне клиента , поэтому ваш список
global-ignores
не будет доступен другим пользователям, и он применяется ко всем репозиториям, которые вы извлекаете на свой компьютер.
- Этот параметр определен в вашем файле области конфигурации времени выполнения:
- Windows (на основе файлов) -
C:\Users\{you}\AppData\Roaming\Subversion\config
- Windows (на основе реестра) -
Software\Tigris.org\Subversion\Config\Miscellany\global-ignores
в HKLM
и HKCU
.
- Linux / Unix -
~/.subversion/config
2 - Свойство svn:ignore
, которое устанавливается для каталогов (не файлов):
- Это хранится в репо, поэтому другие пользователи будут иметь те же файлы игнорирования. Аналогично тому, как работает
.gitignore
.
svn:ignore
применяется к каталогам и не является рекурсивным или наследуется. Любой файл или немедленный подкаталог родительского каталога, соответствующий шаблону файла, будет исключен.
В то время как SVN 1.8 добавляет концепцию «унаследованных свойств», само свойство svn:ignore
игнорируется в каталогах, не являющихся непосредственными потомками:
cd ~/myRepoRoot # Open an existing repo.
echo "foo" > "ignoreThis.txt" # Create a file called "ignoreThis.txt".
svn status # Check to see if the file is ignored or not.
> ? ./ignoreThis.txt
> 1 unversioned file # ...it is NOT currently ignored.
svn propset svn:ignore "ignoreThis.txt" . # Apply the svn:ignore property to the "myRepoRoot" directory.
svn status
> 0 unversioned files # ...but now the file is ignored!
cd subdirectory # now open a subdirectory.
echo "foo" > "ignoreThis.txt" # create another file named "ignoreThis.txt".
svn status
> ? ./subdirectory/ignoreThis.txt # ...and is is NOT ignored!
> 1 unversioned file
(Таким образом, файл ./subdirectory/ignoreThis
не игнорируется, даже если к корню .
репо применяется "ignoreThis.txt
").
Поэтому, чтобы рекурсивно применить список игнорирования, вы должны использовать svn propset svn:ignore <filePattern> . --recursive
.
- Это создаст копию свойства в каждом подкаталоге.
- Если значение
<filePattern>
отличается в дочернем каталоге, тогда значение дочернего элемента полностью переопределяет родителей, поэтому «добавочный» эффект отсутствует.
- Так что если вы измените
<filePattern>
в корне .
, то вы должны изменить его на --recursive
, чтобы перезаписать его в дочерних и дочерних каталогах.
Замечу, что синтаксис командной строки противоречит интуиции.
- Я начал, предполагая, что вы проигнорируете файл в SVN, введя что-то вроде
svn ignore pathToFileToIgnore.txt
, однако это не то, как работает функция игнорирования SVN.
3- svn:global-ignores
свойство. Требуется SVN 1.8 (июнь 2013 г.):
- Это похоже на
svn:ignore
, за исключением того, что использует функцию "унаследованных свойств" SVN 1.8.
- По сравнению с
svn:ignore
шаблон файла автоматически применяется в каждом каталоге-потомке (а не только в непосредственных дочерних элементах).
- Это означает, что нет необходимости устанавливать
svn:global-ignores
с флагом --recursive
, поскольку унаследованные шаблоны игнорируемых файлов автоматически применяются по мере их наследования.
Выполнение того же набора команд, что и в предыдущем примере, но с использованием svn:global-ignores
вместо:
cd ~/myRepoRoot # Open an existing repo
echo "foo" > "ignoreThis.txt" # Create a file called "ignoreThis.txt"
svn status # Check to see if the file is ignored or not
> ? ./ignoreThis.txt
> 1 unversioned file # ...it is NOT currently ignored
svn propset svn:global-ignores "ignoreThis.txt" .
svn status
> 0 unversioned files # ...but now the file is ignored!
cd subdirectory # now open a subdirectory
echo "foo" > "ignoreThis.txt" # create another file named "ignoreThis.txt"
svn status
> 0 unversioned files # the file is ignored here too!
Для пользователей TortoiseSVN:
Вся эта договоренность меня смутила, потому что терминология TortoiseSVN (используемая в их системе меню Windows Explorer) изначально вводила меня в заблуждение - я не был уверен, каково значение меню Ignore «Добавить рекурсивно», «Добавить *» и «Добавить» варианты. Я надеюсь, что этот пост объясняет, как функция Ignore связана с функцией SVN Properties. Тем не менее, я предлагаю использовать командную строку для установки игнорируемых файлов, чтобы вы почувствовали, как это работает, вместо того, чтобы использовать графический интерфейс и использовать графический интерфейс для манипулирования свойствами только после того, как вы освоитесь с командной строкой.
Список файлов, которые игнорируются:
Команда svn status
скроет пропущенные файлы (то есть файлы, которые соответствуют шаблону RGA global-ignores
, или соответствуют шаблону svn:ignore
непосредственного родительского каталога или соответствуют шаблону svn:global-ignores
любого предшествующего каталога.
Используйте опцию --no-ignore
, чтобы увидеть эти файлы в списке. Проигнорированные файлы имеют статус I
, затем перенаправьте вывод в grep
, чтобы показывать только строки, начинающиеся с «I».
Команда:
svn status --no-ignore | grep "^I"
Например:
svn status
> ? foo # An unversioned file
> M modifiedFile.txt # A versioned file that has been modified
svn status --no-ignore
> ? foo # An unversioned file
> I ignoreThis.txt # A file matching an svn:ignore pattern
> M modifiedFile.txt # A versioned file that has been modified
svn status --no-ignore | grep "^I"
> I ignoreThis.txt # A file matching an svn:ignore pattern
та-да!