Как на самом деле работают правила исключения .gitignore?

Я пытаюсь решить проблему с gitignore в большой структуре каталогов, но для упрощения своего вопроса я сократил ее до следующего.

У меня есть следующая структура каталогов из двух файлов (foo, bar) в новом репозитории git (пока нет коммитов):

a/b/c/foo
a/b/c/bar

Очевидно, что 'git status -u' показывает:

# Untracked files:
...
#       a/b/c/bar
#       a/b/c/foo

Я хочу создать файл .gitignore, который игнорирует все, что находится внутри / b / c, но не игнорирует файл 'foo'.

Если я создаю .gitignore таким образом:

c/

Тогда 'git status -u' показывает foo и bar как игнорируемые:

# Untracked files:
...
#       .gitignore

Что и следовало ожидать .

Теперь, если я добавлю правило исключения для foo, таким образом:

c/
!foo

Согласно man-странице gitignore, я ожидаю, что это сработает. Но это не так - он по-прежнему игнорирует foo:

# Untracked files:
...
#       .gitignore

Это тоже не работает:

c/
!a/b/c/foo

Также не работает:

c/*
!foo

Дает :

# Untracked files:
...
#       .gitignore
#       a/b/c/bar
#       a/b/c/foo

В этом случае, хотя foo больше не игнорируется, bar также не игнорируется.

Порядок правил в .gitignore, похоже, тоже не имеет значения.

Это также не делает то, что я ожидал:

a/b/c/
!a/b/c/foo

Этот игнорирует и foo, и bar.

Одна из ситуаций, которая работает, если я создаю файл a / b / c / .gitignore и вставляю туда:

*
!foo

Но проблема с этим заключается в том, что в конечном итоге появятся другие подкаталоги в a / b / c, и я не хочу помещать отдельный .gitignore в каждый отдельный файл - я надеялся создать «основанные на проекте» файлы .gitignore, которые могли бы находиться в верхнем каталоге каждого проекта и покрывать вся «стандартная» структура подкаталогов.

Это также, кажется, эквивалентно:

a/b/c/*
!a/b/c/foo

Это может быть самая близкая вещь к «работе», которую я могу достичь, но необходимо указать полные относительные пути и явные исключения, что происходит Мне будет больно, если у меня много файлов с именем 'foo' на разных уровнях дерева подкаталогов.

В любом случае, либо я не совсем понимаю, как работают правила исключения, либо они вообще не работают, когда каталоги (а не подстановочные знаки) игнорируются - по правилу, оканчивающемуся на /

Может кто-нибудь пожалуйста, проясните это немного?

Есть ли способ заставить gitignore использовать что-то разумное, например, регулярные выражения, вместо этого неуклюжего синтаксиса на основе оболочки?

Я использую и наблюдаю это с помощью git -1.6.6.1 для Cygwin / bash3 и git-1.7.1 для Ubuntu / bash3.

140
задан Pavan Nagadiya 1 July 2019 в 14:38
поделиться