Я намагаюся вирішити проблему 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
За даними сторінки gitignore, я б очікував, що це спрацює. Але це не так - він все ще ігнорує foo:
# Untracked files:
...
# .gitignore
Це також не працює:
c/
!a/b/c/foo
Це також не робить:
c/*
!foo
Дає:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
У цьому випадку, хоч foo вже не ігнорується, бар також не ігнорується.
Порядок правил у .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.