Как игнорировать файлы в Subversion? - PullRequest
609 голосов
/ 17 сентября 2008

Как игнорировать файлы в Subversion?

Кроме того, как мне найти файлы, которые не находятся под контролем версий?

Ответы [ 17 ]

704 голосов
/ 17 сентября 2008

(Этот ответ был обновлен в соответствии с поведением 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

та-да!

83 голосов
/ 25 октября 2013

Используйте следующую команду, чтобы создать список, не относящийся к файлам контроля версий.

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

Затем отредактируйте файл до , оставив только те файлы, которые вы хотите игнорировать . Затем используйте этот, чтобы игнорировать файлы, перечисленные в файле:

svn propset svn:ignore -F ignoring.txt .

Обратите внимание на точку в конце линии. Он сообщает SVN, что свойство устанавливается в текущем каталоге.

Удалить файл:

rm ignoring.txt

Наконец, коммит,

svn ci --message "ignoring some files"

Затем вы можете проверить, какие файлы игнорируются с помощью:

svn proplist -v
47 голосов
/ 17 сентября 2008

Если вы используете TortoiseSVN , щелкните правой кнопкой мыши файл и выберите TortoiseSVN / Добавить в список игнорирования . Это добавит файл / подстановочный знак к свойству svn:ignore.

svn:ignore будет проверяться при проверке файлов, и соответствующие файлы будут игнорироваться. У меня есть следующий список игнорирования для проекта Visual Studio .NET:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Вы можете найти этот список в контекстном меню по адресу TortoiseSVN / Свойства .

37 голосов
/ 26 августа 2014

Вы можете игнорировать файл или каталог, например .gitignore . Просто создайте текстовый файл со списком каталогов / файлов, которые вы хотите игнорировать, и запустите следующий код:

svn propset svn:ignore -F ignorelist.txt .

ИЛИ, если вы не хотите использовать текстовый файл, вы можете сделать это следующим образом:

svn propset svn:ignore "first
 second
 third" .

Источник: Блог Карстена - Установите svn: ignore для нескольких файлов из командной строки

22 голосов
/ 26 марта 2014

Я нашел статью .svnignore Пример Java .

Пример: .svnignore для Ruby on Rails,

/log

/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif

*.*~

И после этого:

svn propset svn:ignore -F .svnignore .

Примеры для .gitignore. Вы можете использовать для .svnignore

https://github.com/github/gitignore

16 голосов
/ 27 июля 2017

Как никто, кажется, не упомянул об этом ...

svn propedit svn:ignore .

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

10 голосов
/ 01 марта 2011

При использовании propedit убедитесь, что у вас нет завершающих пробелов, так как это приведет к исключению файла из списка игнорирования.

Они вставляются автоматически, если вы используете tab-autocomplete в linux для создания файла, с которого начинаются:

svn propset svn:ignore 'file1
file2' .
8 голосов
/ 29 мая 2015

Другое решение:

svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt

или построчно

svn st | awk '/^?/{print $2}' > svnignore.txt 
svn propget svn:ignore >> svnignore.txt 
svn propset svn:ignore -F svnignore.txt . 
rm svnignore.txt

Что он делает:

  1. Получает файлы состояния из svn
  2. Сохраняет все файлы с ? в файл "svnignore.txt"
  3. Получает уже проигнорированные файлы и добавляет их в файл "svnignore.txt"
  4. Указывает svn игнорировать файлы в "svnignore.txt"
  5. Удаляет файл
7 голосов
/ 01 марта 2013

Также, если вы используете Tornise SVN, вы можете сделать это:

  1. В контекстном меню выберите «TortoiseSVN», затем «Свойства»
  2. В появившемся окне нажмите «Новый», затем «Дополнительно»
  3. В появившемся окне напротив «Имя свойства» выберите или введите «svn: ignore», напротив «Значение свойства» введите желаемое имя файла или имя папки или маску файла (в моем случае это было «* / target») нажмите «Рекурсивно применить свойство»
  4. Ok. Хорошо.
  5. Commit
5 голосов
/ 01 декабря 2016

Более читаемая версия ответа bkbilly:

svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt

Что он делает:

  1. Получает файлы состояния из svn
  2. Сохраняет все файлы с ? в файл "svnignore.txt"
  3. Получает уже проигнорированные файлы и добавляет их в файл "svnignore.txt"
  4. Указывает svn игнорировать файлы в "svnignore.txt"
  5. Удаляет файл
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...