Почему gitignore не работает в этом случае?

У меня есть два файла, которые я хочу игнорировать:

  • .идея/рабочее пространство.xml
  • какое-то приложение/src/.idea/workspace.xml

Я подумал, что достаточно добавить это единственное правило в .gitignore:

.idea/workspace.xml

Но он перехватывает только .idea/workspace.xml верхнего уровня (состояние git показывает, что someapp/src/.idea/workspace.xml не отслеживается).

Я также пробовал **/.idea/workspace.xml, но это вообще не работает. Помощь?


person ripper234    schedule 16.11.2011    source источник
comment
Попробуйте также игнорировать someapp/src/.idea/workspace.xml?   -  person Shahbaz    schedule 16.11.2011
comment
Возможно *workspace.xml подойдет?   -  person chelmertz    schedule 16.11.2011
comment
@Shahbaz - это работает, но я не понимаю, почему .idea/workspace.xml не работает.   -  person ripper234    schedule 16.11.2011
comment
@ ripper234: Возможно, элементы с косой чертой в em считаются полными путями? кстати йо Гевер   -  person yairchu    schedule 16.11.2011
comment
@yairchu - как дела :) Я думал, что полные пути должны начинаться с косой черты.   -  person ripper234    schedule 16.11.2011
comment
@chelmertz - подойдет, но я подумал, что .idea/workspace.xml тоже должен это делать - и маленький кулон внутри меня предпочитает его из-за шанса попасть в файл workspace.xml, который не имеет отношения к Идее.   -  person ripper234    schedule 16.11.2011


Ответы (5)


  • […]
  • Если шаблон не содержит косую черту /, git рассматривает его как шаблон глобуса оболочки и проверяет соответствие имени пути относительно местоположения файла .gitignore (относительно верхнего уровня рабочего дерева, если не из .gitignore файл).
  • В противном случае git рассматривает шаблон как шаблон оболочки, подходящий для использования fnmatch(3) с флагом FNM_PATHNAME: подстановочные знаки в шаблоне не будут соответствовать символу / в пути. […]

Как только путь содержит косую черту, Git больше не будет проверять совпадение в пути, а вместо этого будет напрямую использовать поведение glob. Таким образом, вы не можете сопоставить .idea/workspace.xml, а только workspace.xml.

Руководство по Git: gitignore.

person poke    schedule 16.11.2011
comment
@manojlds Я надеюсь, что нет… :/ Если шаблон не содержит косой черты, он будет соответствовать имени пути, но если он содержит косую черту, он больше не будет этого делать и будет отображаться напрямую. - person poke; 16.11.2011
comment
да это задом наперёд. без косой черты = соответствие глобусу. косая черта = нет совпадения. glob означает, что * может соответствовать косой черте - person Jared Forsyth; 23.08.2013
comment
NB: это уже не так для последних версий git; обратитесь к ответу ниже для обновленного ответа stackoverflow.com/a/19557737/3064736 - person Maximilian; 30.01.2021

Это изменено в git 1.8.4

Использование функции платформы fnmatch(3) (во многих местах, таких как сопоставление pathspec, .gitignore и .gitattributes) было заменено на wildmatch, что позволяет «foo/**/bar» соответствовать «foo/bar», «foo/a/bar». ", так далее.

**/.idea/workspace.xml теперь должно работать в этом примере.

person eddiegroves    schedule 24.10.2013

См. примеры в руководстве gitignore:

"Документация/*.html" соответствует "Документация/git.html", но не "Документация/ppc/ppc.html" или "tools/perf/Documentation/perf.html"

Таким образом, .idea/workspace.xml будет соответствовать корневому, но не someapp/src/.idea/workspace.xml.

Но в зависимости от вашей реализации fnmatch это то, что вам нужно в вашем .gitignore:

.idea/workspace.xml
**/.idea/workspace.xml
person manojlds    schedule 16.11.2011
comment
@ ripper234 - Как я уже сказал, зависит от реализации fnmatch. Работает на меня. - person manojlds; 16.11.2011
comment
Я на винде, возможно в этом причина разницы. - person ripper234; 16.11.2011
comment
Сейчас у меня работает в Windows, в частности правило public/**/*.html работает, а public/*.html нет. - person DanH; 28.02.2015

попробуй это

/**/.idea/workspace.xml

person franci    schedule 24.11.2011

Согласно справочной странице gitignore:

Шаблоны, считываемые из файла .gitignore в том же каталоге, что и путь, или в любом родительском каталоге, при этом шаблоны в файлах более высокого уровня (вплоть до верхнего уровня рабочего дерева) переопределяются шаблонами в файлах более низкого уровня до каталога. содержащий файл. Эти шаблоны совпадают с расположением файла .gitignore. Проект обычно включает такие файлы .gitignore в свой репозиторий, содержащий шаблоны для файлов, сгенерированных как часть сборки проекта.

(выделено мной)

person DanR    schedule 16.11.2011