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

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

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

Забавно видеть, как каждый простой вопрос (вероятно, от пользователя git) означает множество чрезмерно сложных ответов. Если это произойдет, это ребенок Subversion.

Valerio Bozz 20.03.2020 17:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
672
1
601 488
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Ответ принят как подходящий

(Этот ответ был обновлен, чтобы соответствовать поведению 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) изначально вводила меня в заблуждение - я не был уверен, какое значение имеют пункты «Добавить рекурсивно», «Добавить *» и «Добавить» в меню Игнорировать. опции. Я надеюсь, что этот пост объясняет, как функция игнорирования связана с функцией свойств SVN. Тем не менее, я предлагаю использовать командную строку для установки игнорируемых файлов, чтобы вы могли почувствовать, как это работает, вместо использования графического интерфейса пользователя и использовать графический интерфейс для управления свойствами только после того, как вы освоитесь с командной строкой.

Список файлов, которые игнорируются:

Команда 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

та-да!

Чтобы найти игнорируемые файлы: svn status -u -v --no-ignore | grep "^ I" | awk "{print \ $ 2}"

Christian Madsen 15.09.2010 14:32

если вы хотите игнорировать файл ./FolderS/FolderB/FileToIgnore, сделайте это из вашего. папка: svn propset svn: ignore "File To Ignore" FolderS / FolderB /

jnj 19.11.2012 03:51

Спасибо. Обратите внимание: если вы используете одинарные кавычки в своих awk-программах, вам не нужно избегать (обычно используемого) знака доллара. Просто гнида. :-D

JJC 24.05.2013 03:30

если вы используете ssh'ing svn propedit svn:ignore . и текстовый редактор не настроен, вы получите сообщение об ошибке svn: E205007: ни одна из переменных среды SVN_EDITOR, VISUAL или EDITOR не установлена, и не было найдено ни одной опции конфигурации времени выполнения 'editor-cmd' вместо открытия редактора. Так что просто укажите --editor-cmd nano как этот svn propedit svn:ignore . --editor-cmd nano

Jonathan Morales Vélez 01.08.2013 03:01

Эта команда должна выполняться внутри папки, содержащей файлы, которые нужно игнорировать? Я имею в виду ... о ... . - это папка для установки?

Nakilon 26.09.2013 22:33

@ Накилон да. Вы можете указать папку и. это текущая папка

SgtPooki 25.03.2014 17:14

Вы также можете игнорировать файлы с определенным именем во всех подпапках, используя аргумент «--recursive». то есть svn propset svn: игнорировать "* .jpg". - рекурсивный

Templar 02.04.2014 23:20

Более простой альтернативой awk является grep: svn status | grep '^?'

Johnride 01.07.2014 01:48

Обратите внимание, что в Windows первая команда может завершиться ошибкой в ​​зависимости от того, какие файлы находятся в текущем каталоге с (filename) is not under version control. В этом случае вы должны использовать вторую команду вместо редактирования вашего списка игнорирования. Вам может потребоваться сначала установить свой редактор, например, set SVN_EDITOR=notepad

D Coetzee 31.07.2014 22:13

EDITOR=vi svn propedit svn:ignore . решает любые сомнения

fiorentinoing 24.01.2017 14:22

@Johnride, ты имеешь в виду -v, не так ли?

Narcolessico 09.01.2018 16:43

Возможно, стоит упомянуть, что svn propset переопределяет любой предыдущий svn propset.

Ben Aveling 25.02.2018 15:00

Я добавил bindebugobj в svn:global-ignores, но после этого, когда я svn propget svn:global-ignores, он возвращает только obj (последний), как я могу игнорировать несколько файлов / папок?

Luke 20.06.2018 05:47

Безусловно, лучший ответ.

Alfonso Nishikawa 28.12.2018 16:24

отличный ответ :)

Daniele 24.01.2019 14:51

svn status сообщит вам, каких файлов нет в SVN, а также что изменилось.

Посмотрите на Свойства SVN для свойства игнорировать.

Для всего SVN требуется чтение Красная книга.

Вы также можете установить глобальный шаблон игнорирования в файле конфигурации SVN.

Можете ли вы установить шаблон игнорирования для определенного репозитория?

David Doria 27.02.2012 06:23

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

Что касается игнорирования файлов, вам необходимо отредактировать свойство svn: ignore, прочтите главу Игнорирование неверсированных элементов в svnbook по адресу http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.ignore.html. В книге также рассказывается больше об использовании svn status.

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

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

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

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

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

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

svn propset svn:ignore 'file1
file2' .

Это работает только для некоторых оболочек, таких как bash. Обратите внимание, что повторное выполнение команды propset перезаписывает предыдущий набор шаблонов.

J. A. Faucett 12.09.2012 02:21

Значит, file1 и файл2 должны быть на разных строках?

IgorGanapolsky 12.08.2016 18:26

Кроме того, если вы используете Tortoise SVN, вы можете сделать это:

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

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

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

Отлично. Незначительное улучшение - svn status | awk "/^?/ {print $2}" > ignoring.txt.

Dirk Eddelbuettel 22.08.2014 18:48

зачем удалять файл? сохраните его в репо, если вам нужно воссоздать / добавить / удалить

tgkprog 14.03.2015 19:28

Обратите внимание, что это решение не будет игнорировать файлы в подкаталогах (даже если они отображаются в ignoring.txt).

shaneb 24.04.2017 23:02

Сохранит ли это существующие игнорирования? Если нет, как это сделать одной командой (т.е. --no-ignores и сохранить также строки, которым предшествует I)?

a1an 19.06.2017 16:49

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

ulitosCoder 22.06.2017 18:24

@tgkprog - это всего лишь одноразовое использование для загрузки файлов в свойства. Таким образом, не гарантируется, что файл будет содержать то же, что и в свойствах. Поэтому имеет смысл удалить его и заставить людей запускать svn proplist -v, чтобы проверить, какие файлы на самом деле игнорируются.

icc97 30.08.2017 16:37

Нашел статью .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

Я сделал, как ты сказал ... но когда я запустил svn status. он по-прежнему показывает проигнорированные файлы с "?"

Harshit Gupta 27.03.2014 05:11

Я никогда не проверял svn status, но с svn add * и после этого svn commit игнорирование файлов не фиксируется.

d.danailov 27.03.2014 11:48

если файл «a.txt» уже находится в системе контроля версий, то игнорирование выполняется командой типа «svn propset svn: ignore -F .svnignore a.txt»? это правильно?

errakeshpd 30.12.2014 07:13

Если вы добавите «a.txt» в свой файл .svnignore, я не уверен, но команда должна быть правильной.

d.danailov 30.12.2014 09:55

.gitignore подобный подход

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

svn propset svn:ignore -F ignorelist.txt .

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

svn propset svn:ignore "first
 second
 third" .

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

Обратите внимание, что если вы позже измените файл игнорирования, вам нужно будет повторно запустить команду svn:ignore (см. stackoverflow.com/a/58380306/189518)

Sensei James 18.10.2019 23:02

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

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

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

svn st | awk '/^?/{print }' > 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. Удаляет файл

Более читабельная версия Ответ bkbilly:

svn st | awk '/^?/{print }' > 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. Удаляет файл

Мне нравится ответ bkbilly, но эта версия разбивает каждую строку, чтобы сделать ее более читаемой, и удаляет &&, который в моих тестах ничего не сделал, поскольку первая строка всегда создает временный файл, и этот же временный файл всегда попадает в список игнорирования.

LivingDust 01.12.2016 04:09

В этом случае предложение редактирования было бы более подходящим. Цените старания!

Jim 01.12.2016 05:03

У меня еще не было достаточно репутации, чтобы предлагать правку. но я не хочу портить хороший протокол. Есть ли в README простые инструкции о том, когда лучше предлагать и редактировать, а не публиковать новый ответ и т. д.?

LivingDust 12.12.2016 20:18

Если ваш ответ точно такой же, как тот, что был опубликован полтора года назад, это довольно просто. Вы даже скопировали объяснение "Что оно делает".

Jim 12.12.2016 22:11
  1. cd ~ / .subversion
  2. открыть конфигурацию
  3. найдите строку вроде 'global-ignores'
  4. установите тип игнорируемого файла следующим образом: global-ignores = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. Swp .DS_Store вывод node_modules

Спасибо, ваш ответ единственный, в котором упоминается файл config.

Henrique de Sousa 25.05.2017 12:32

В этом ответе также упоминается @HenriquedeSousa stackoverflow.com/a/86052/7724, а также объясняется, что это локальный клиентский способ игнорирования файлов.

bzlm 14.09.2017 20:31

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

svn propedit svn:ignore .

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

Этот ответ был полезен. В моем случае мне нужно было изменить "." в подкаталог файла, который я хотел игнорировать, и просто указать шаблон файла. Кроме того, в первый раз мне нужно было запустить это (я на Mac): export SVN_EDITOR = "nano"

Elijah Lofgren 16.11.2017 07:31

SVN ignore легко управлять в TortoiseSVN. Откройте TortoiseSVN и щелкните правой кнопкой мыши меню файла, затем выберите Добавить в список игнорирования.

Это добавит файлы в свойство svn:ignore. Когда мы проверяем файлы, то те файлы, которые соответствуют svn:ignore, будут проигнорированы и не будут зафиксированы.

В проект Visual Studio мы добавили следующие файлы, которые нужно игнорировать:

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

Мы успешно управляем исходным кодом на SVN Ловушка сравнения, используя этот метод.

  1. open вы используете продукт JetBrains (например, Pycharm)
  2. затем нажмите кнопку «зафиксировать» на верхней панели инструментов или используйте сочетание клавиш «ctrl + k» screenshot_toolbar
  3. в интерфейсе фиксации переместите ненужные файлы в другой список изменений, как показано ниже. screenshot_commit_change
  4. в следующий раз вы можете зафиксировать только список изменений по умолчанию.

Что для меня работал (Я использую TortoiseSVN v1.13.1):

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

1. В проводнике щелкните правой кнопкой мыши SVN имя папки проекта
. 2. Нажмите "SVN Commit ..."
3. Появится окно "фиксация"
4.Щелкните правой кнопкой мыши в папке / файле, который вы хотите игнорировать. 5. Нажмите "Добавить в список игнорирования"
. 6. выберите имя папки / файла, которое вы хотите игнорировать.

  • Есть несколько вариантов (4 для меня), если вы выберете только имя папки / файла, оно будет добавлено в список svn: ignore
  • если вы выберете имя папки / файла с помощью (рекурсивно), оно будет добавлено в svn: global-ignores. Это то, что я обычно выбираю, поскольку это изменение автоматически наследуется всеми подкаталогами.

7.Совершить "изменение свойства" на SVN

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

После шага 3 выше нажмите «Показать неверсированные файлы» следующим образом:

Другие вопросы по теме