Использование svn:ignore для игнорирования всего, кроме определенных файлов

Есть ли способ с помощью свойства svn:ignore указать, что я хочу игнорировать, основываясь на шаблонах, которые я не хочу игнорировать? Другими словами, я хочу игнорировать все, кроме файлов, оканчивающихся на .xyz. Как мне это сделать (если это вообще возможно)?

Один из вариантов, который я исследовал, — это зафиксировать все, что я хочу версионировать, а затем установить для свойства svn:ignore в каталоге значение «*», что означает, что никакие другие файлы, кроме тех, которые я уже зафиксировал, не будут версионированы. Это лучшее, что я могу придумать, но это кажется грязным в том смысле, что если бы мне когда-либо нужно было добавить еще один файл в качестве версии, мне пришлось бы сделать несколько коммитов... один для удаления свойства svn:ignore, другой чтобы добавить/зафиксировать новый файл(ы), а затем третий, чтобы изменить svn:ignore обратно на '*'.

Твои мысли?


person whaley    schedule 16.07.2009    source источник


Ответы (6)


Нет, нет эксклюзивного сопоставления, как вы описали. В этой статье перечислены возможности сопоставление с образцом. Это ограничено:

  • ? — соответствует любому одиночному символу
  • * — соответствует любой строке символов, включая пустую строку.
  • [ — Начинает определение класса символов, заканчивающееся ], используемое для сопоставления подмножества символов.

Подобный вопрос уже задавался здесь.

person mkoeller    schedule 16.07.2009
comment
fnmatch немного больше, чем упомянуто в этом ответе. См. ответ Томки ниже docs.python.org/2/library/fnmatch.html - person vinnyjames; 19.04.2013

Взгляните на Использование отрицательных шаблонов для svn Subversion. :игнорировать свойство. Очевидно, вы можете использовать ! в группах символов, чтобы отрицать его значение. Поэтому, если вы хотите игнорировать все, кроме файлов, оканчивающихся на .java, установите следующий шаблон svn:ignore:

*[!j][!a][!v][!a]
*.java?*
person tomka    schedule 20.10.2010
comment
На самом деле я спросил jcscoobyrs (который управляет пакетом svn в OSX) об этом в IRC в тот день, что привело к его сообщению на Thoughtpark.org. Я ссылаюсь на это в комментарии к принятому ответу. Просто показывает, что каким бы замечательным ни был stackoverflow.com, он все равно не может сравниться с общением с коммиттером проекта в IRC. - person whaley; 21.10.2010
comment
Правильным будет: *[!j][!a][!v][!a] *j[!a][!v][!a] *ja[!v][!a] *jav[ !а] - person Nux; 16.12.2012
comment
Ссылка не работает. - person James; 11.01.2017
comment
*[!a] *[!v]a *[!a]va *[!j]ava *[!.]java текущее решение не игнорирует ничего, что заканчивается на a, и оно будет игнорировать my.javaParser.java - person Rick; 07.04.2017

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

Однако вам нужно будет добавить этот параметр во все подкаталоги.

# Create a repository with property ignore *

[wlynch@orange ~] cd /tmp
[wlynch@orange /tmp] svnadmin create foo
[wlynch@orange /tmp] svn co file:///tmp/foo co
Checked out revision 0.
[wlynch@orange /tmp] cd co
[wlynch@orange co] svn propset svn:ignore \* .
property 'svn:ignore' set on '.'

# Create 3 files

[wlynch@orange co] touch a
[wlynch@orange co] touch b
[wlynch@orange co] touch c

# We can add all 3 of these files in one transaction

[wlynch@orange co] svn status
M     .
[wlynch@orange co] svn add a
A         a
[wlynch@orange co] svn add b
A         b
[wlynch@orange co] svn status
M     .
A      a
A      b
[wlynch@orange co] svn add c
A         c
[wlynch@orange co] svn ci
Sending        .
Adding         a
Adding         b
Adding         c
Transmitting file data ...
Committed revision 1.
person Bill Lynch    schedule 16.07.2009
comment
Спасибо за совет. Я не знал, что вы можете явно добавлять файлы, поскольку, по-видимому, svn add игнорирует svn:ignore. - person whaley; 17.07.2009
comment
Пользователи TortoiseSVN (1.8) злятся, если вы пытаетесь добавить игнорируемый файл через его графический интерфейс, но вы можете сделать это через командную строку. - person AlexMA; 04.09.2013

Это то, что я установил в папке bin для свойства svn:ignore, чтобы оно соответствовало всему, кроме файлов apk:

*[!a][!p][!k]
*a[!p][!k]
*ap[!k]

Если бы была полная поддержка RegExp, вы могли бы использовать отрицательный просмотр назад, но это все равно редко реализуется (например, не в JavaScript) и неэффективно.

person Nux    schedule 16.12.2012

Следующее работает для меня и избавляет от некоторых причуд других предложений.

*.?
*.??
*.???
*.[!j]???
*.?[!a]??
*.??[!v]?
*.???[!a]
*.?????*

Ниже следует построчное объяснение:

  • игнорировать все, что имеет однобуквенное расширение
  • игнорировать все, что имеет двухбуквенное расширение
  • игнорировать все, что имеет трехбуквенное расширение
  • игнорировать все, что имеет четырехбуквенное расширение, где первая буква расширения не j
  • игнорировать все, что имеет четырехбуквенное расширение, где вторая буква расширения не является
  • игнорировать все, что имеет четырехбуквенное расширение, где третья буква расширения не v
  • игнорировать все, что имеет четырехбуквенное расширение, где четвертая буква расширения не является
  • игнорировать все, что имеет расширение из пяти букв или более

Ограничения:

  • Это также заблокирует каталоги, заканчивающиеся на .java.
  • К сожалению, я не мог игнорировать файлы без расширения, так как это также блокировало бы каталоги.
person Cerno    schedule 31.01.2014

Ну, я не знаю, пропустил ли я что-то, но вы можете использовать любой шаблон, который хотите:

svn propset svn:ignore "*~" .

Вы можете проверить с помощью:

svn propget svn:ignore .

Другой способ — использовать псевдоним/скрипт, который может выполнять сложный синтаксический анализ при фиксации.

Лучшее решение, которое я нашел для себя, — это полностью отделить версионное дерево исходных файлов от дерева сборки. Таким образом, вы не создаете ничего в своем версионном дереве каталога. Затем вы можете использовать svn:ignore только для игнорирования простых артефактов, созданных, например, текстовыми редакторами.

РЕДАКТИРОВАТЬ:

Извините за ошибку в первом решении, я неправильно прочитал ваш пост. Два других способа кажутся актуальными, даже если это не совсем то, что вы хотите...

person neuro    schedule 16.07.2009
comment
Я думаю, что ваше первое решение на что-то, однако. Не могли бы вы установить регулярное выражение svn:ignore, которое соответствует всем, кроме файлов, оканчивающихся на .xyz? - person jprete; 16.07.2009
comment
@jprete, к сожалению, регулярные выражения не разрешены. сопоставление с образцом основано на fnmatch. - person whaley; 17.07.2009