Ответ 1
(Этот ответ обновлен в соответствии с поведением 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
не будет использоваться другими пользователями, и он применим ко всем репозициям на вашем компьютере. - Этот параметр определен в вашем файле области конфигурации Runtime:
- Windows (на основе файлов) -
C:\Users\{you}\AppData\Roaming\Subversion\config
- Windows (на основе реестра) -
Software\Tigris.org\Subversion\Config\Miscellany\global-ignores
как вHKLM
, так иHKCU
. - Linux/Unix -
~/.subversion/config
- Windows (на основе файлов) -
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
" применяется к корню repo.
). -
Поэтому, чтобы применить список игнорирования рекурсивно, вы должны использовать
svn propset svn:ignore <filePattern> . --recursive
.- Это создаст копию свойства в каждом подкаталоге.
- Если значение
<filePattern>
отличается от дочернего каталога, тогда дочернее значение полностью переопределяет родителей, поэтому эффект добавления не существует. - Итак, если вы измените
<filePattern>
на корневой каталог.
, вы должны изменить его с помощью--recursive
, чтобы перезаписать его в дочерних и потоковых каталогах.
-
Я отмечаю, что синтаксис командной строки является интуитивно понятным.
- Я начал с предположения, что вы проигнорируете файл в SVN, набрав что-то вроде
svn ignore pathToFileToIgnore.txt
, но это не так, как работает функция игнорирования SVN.
- Я начал с предположения, что вы проигнорируете файл в SVN, набрав что-то вроде
3- Свойство svn:global-ignores
. Требуется SVN 1.8 (июнь 2013 г.):
- Это похоже на
svn:ignore
, за исключением того, что использует функцию SVN 1.8 "inherited properties". - Сравните с
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) изначально вводила меня в заблуждение - я не знал, какое значение имеет меню Игнорировать "Добавить рекурсивно", "Добавить *" и "Добавить". Надеюсь, что в этом сообщении объясняется, как функция Игнорировать связана с функцией SVN Properties. Тем не менее, я предлагаю использовать командную строку для установки игнорируемых файлов, чтобы вы могли понять, как это работает, вместо использования графического интерфейса, и только с помощью графического интерфейса для управления свойствами после удобного использования командной строки.
Список файлов, которые игнорируются:
Команда svn status
скроет проигнорированные файлы (то есть файлы, соответствующие шаблону RGA global-ignores
), или сопоставляет шаблон исходного родительского каталога svn:ignore
или соответствует любому шаблону anceor 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
та-да!