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

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

  • .idea/workspace.xml
  • someapp/SRC/.idea/workspace.xml

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

.idea/workspace.xml

Но он попадает только на верхний уровень .idea/workspace.xml(git status показывает someapp/src/.idea/workspace.xml как untracked).

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

Ответ 1

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

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

Git руководство: gitignore.

Ответ 2

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

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

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

Ответ 3

См. примеры в руководстве 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

Ответ 4

попробуйте это

/**/.idea/workspace.xml

Ответ 5

Согласно странице руководства gitignore:

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

(акцент мой)