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

645

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

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

andyuk
источник
Интересно видеть, как каждый простой вопрос (вероятно, от пользователя git) означает много слишком сложных ответов. Если это произойдет, это Subversion, детка.
Валерио Бозз

Ответы:

738

(Этот ответ был обновлен в соответствии с поведением 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будет скрывать пропущенные файлы (то есть файлы, которые соответствуют global-ignoresшаблону RGA или соответствуют шаблону непосредственного родительского каталога 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

та-да!

andyuk
источник
6
Чтобы найти пропущенные файлы: svn status -u -v --no-ignore | grep "^ I" | awk "{print \ $ 2}"
Кристиан Мадсен,
3
если вы хотите игнорировать файл ./FolderA/FolderB/FileToIgnore, сделайте это из своего. папка: svn propset svn: игнорировать «FileToIgnore» FolderA / FolderB /
jnj
8
если вы используете ssh svn propedit svn:ignore .и текстовый редактор не настроен, вы получите сообщение об ошибке svn: E205007: ни одна из переменных окружения SVN_EDITOR, VISUAL или EDITOR не задана, и параметр конфигурации editor-cmd во время выполнения не был найдено вместо открытия редактора. Так что просто укажите --editor-cmd nano, как этоsvn propedit svn:ignore . --editor-cmd nano
Джонатан Моралес Велес
12
Вы также можете игнорировать файлы с определенным именем файла во всех подпапках, используя аргумент «--recursive». то есть svn propset svn: игнорировать "* .jpg". --recursive
Templar
2
Более простой альтернативой awk является grep:svn status | grep '^?'
Johnride
91

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

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
ulitosCoder
источник
2
Ницца. Незначительное улучшение есть svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Дирк Эддельбюттель
4
зачем удалять файл? держите его в репо, если вам нужно заново создать / добавить / удалить
tgkprog
Обратите внимание, что это решение не будет игнорировать файлы в подкаталогах (даже если они отображаются в ignoring.txt).
shaneb
Будет ли это держать существующие игнорирует? Если нет, то как это сделать в одной команде (т.е. --no-ignore и сохранить также строки, предшествующие I)?
A1An
Это перезапишет ваши текущие игнорирования, попробуйте: svn pg svn:ignore . >> ignore.txtпосле первой команды, чтобы добавить текущие игнорирования в файл.
ulitosCoder
55

.gitignore как подход

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

svn propset svn:ignore -F ignorelist.txt .

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

svn propset svn:ignore "first
 second
 third" .

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

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

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

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

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

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

artur02
источник
27

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

svn propedit svn:ignore .

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

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

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

d.danailov
источник
1
я сделал, как ты сказал ... но когда я запускаю статус SVN. он по-прежнему показывает проигнорированные файлы с "?"
Харшит Гупта
Я никогда не проверял статус svn, но с помощью svn add * и после этого svn commit игнорирование файлов не фиксируется.
д.данаилов
если файл «a.txt» уже находится в управлении версиями, то игнорирование выполняется командой вроде «svn propset svn: ignore -F .svnignore a.txt»? это правильно?
errakeshpd
Если вы добавите «.txt» в ваш файл .svnignore, я не уверен, но команда должна быть правильной.
д.данаилов
10

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

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

svn propset svn:ignore 'file1
file2' .
Кеннет
источник
6
Это работает только для некоторых оболочек, таких как bash. Обратите внимание, что при повторном вводе команды propset предыдущий набор шаблонов перезаписывается.
JA Faucett
Таким образом, file1 и file2 должны быть в отдельных строках?
Игорь Ганапольский
8

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

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. Удаляет файл
bkbilly
источник
8

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

  1. В контекстном меню выберите «TortoiseSVN», затем «Свойства»
  2. В появившемся окне нажмите «Новый», затем «Дополнительно»
  3. В появившемся окне напротив «Имя свойства» выберите или введите «svn: ignore», напротив «Значение свойства» введите желаемое имя файла или имя папки или маску файла (в моем случае это было «* / target»), нажмите «Применить». свойство рекурсивно
  4. Хорошо. Хорошо.
  5. совершить
msangel
источник
6
  1. CD ~ /. Subversion
  2. открыть конфиг
  3. найдите строку вроде «global-ignores»
  4. set игнорировать тип файла следующим образом: global-ignores = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Store выходной файл node_modules
范 陆 离
источник
Спасибо, ваш ответ - единственный, который упоминает configфайл.
Энрике де Соуза
В этом ответе также упоминается @HenriquedeSousa stackoverflow.com/a/86052/7724, а также объясняется, что это способ игнорирования файлов только для локального клиента.
bzlm
5

Более читаемая версия ответа 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. Удаляет файл
LivingDust
источник
Мне нравится ответ bkbilly, но эта версия разбивает каждую строку, чтобы сделать его более читабельным, и удаляет символ &&, который в моих тестах ничего не делал, поскольку первая строка всегда создает временный файл, и этот же временный файл всегда попадает в список игнорирования.
LivingDust
Предложение по редактированию было бы более уместным в этом случае. Цените усилия!
Джим
У меня еще не было достаточно репутации, чтобы предложить редактирование. но я не хочу портить хороший протокол. Существует ли простой README по руководящим принципам, когда лучше предлагать и редактировать, а не публиковать новый ответ и т. Д.?
LivingDust
1
Если ваш ответ точно такой же, как и тот, который был опубликован полтора года назад, он довольно прост. Вы даже скопировали объяснение « что он делает ».
Джим
3

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

петр к.
источник
1
Можете ли вы установить шаблон игнорирования для конкретного хранилища?
Дэвид Дория
2

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

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

Андреас Холстенсон
источник
2

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

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

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

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

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

слабина
источник
2

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

Как игнорировать файлы в Subversion?
1. В проводнике щелкните правой кнопкой мыши имя папки проекта
SVN
2. Нажмите «SVN Commit ...» 3. Появится окно «commit»
4. Щелкните правой кнопкой мыши папку / файл, который вы хотите игнорировать
5.Нажмите «Добавить, чтобы игнорировать список».
6. Выберите папку / файл.
7.Отправьте «изменение свойства» в SVN.

Кроме того, как мне найти файлы, которые не находятся под контролем версий?
После шага 3 выше нажмите «Показать неверсионные файлы»

jumping_monkey
источник
0
  1. Откройте вы используете продукт JetBrains (например, Pycharm)
  2. Затем нажмите на кнопку «фиксации» на верхней панели или использование клавиш «Ctrl + K» screenshot_toolbar
  3. в интерфейсе фиксации переместите ненужные файлы в другой список изменений следующим образом. screenshot_commit_change
  4. в следующий раз вы сможете зафиксировать только список изменений по умолчанию.
Г. Гугол
источник