Як мені сказати Git ігнорувати все, крім підкаталогу?


218

Я хочу ігнорувати всі файли в моєму сховищі, крім тих, що трапляються у binпідкаталозі. Я спробував додати наступне .gitignore:

*
!bin/*

Однак це не дає бажаного ефекту: я створив новий файл всередині bin/, але все git statusще показує nothing to commit (working directory clean).

Будь-які пропозиції?


Відповіді:


273

Це ігнорує кореневі файли та кореневі каталоги, а потім ігнорує каталог кореневих бін:

/*
/*/
!/bin/

Таким чином ви отримуєте весь каталог бін, включаючи підкаталоги та їх файли.


25
Чомусь це для мене не працює послідовно. У мене є два рядки , /stuff/і !/stuff/specific/, але вона по- , як і раніше ігнорує / речі / Окрему /
LB--

1
@ LB-- У мене була подібна проблема, і git check-ignore -vмені сказали, що це~/.gitignore
gurney alex

@gurneyalex Я з'ясував, що він виправляє себе, якщо я видаляю локальне репо і повторно клоную його, це повинен бути помилка.
LB--

2
Чи потрібне / * /?
Алекс Бейкер

3
Це не спрацювало для мене. Мені довелося додати !/bin/до свого кореневого .gitignoreфайлу, але потім додатково мені довелося додати /bin/.gitignoreфайл із !*... Внесення лише однієї з цих змін не спрацювало. Це спрацювало лише після поєднання обох змін.
Феліпе Брам

113

Ось як ігнорувати все, крім одного каталогу " MY_SUPER_DUPER_TEMPLATE_directory " у деякому каталозі

Структура: / бітрикс / шаблони / MY_SUPER_DUPER_TEMPLATE_директорія

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore

1
Це творило чудеса для розпізнавання пакета постачальників Laravel, який я змінив! Дякую, ти врятував мені багато головних болів
Марія Віларо

Це слід вибрати як найкращу відповідь.
Bahman.A

63

Ви повинні виключити все на шляху до пунктів призначення, але ви повинні включити пункти призначення:

Примітка. Це файл виключення (тобто. Gitignore), тому логіка інвертована. Ігноруйте всі, крім каталогу tsp, ігноруйте все в каталозі tsp, крім каталогу src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore

11
+1 для принципу включення каталогу, потім, виключаючи його вміст, потім, включаючи потрібний підкаталог тощо. Я в кінцевому підсумку використовував цю відповідь у своїх проектах.
Іван Ісус

40

Єдине питання у вас є те, що сам binкаталог не відповідає bin/*шаблону, тому git навіть не шукає в binкаталозі.

Є два рішення, які спадають на думку.

.gitignore :

*
!/bin/
!bin/*

або

.gitignore :

*
!/bin/

bin/.gitignore :

!*

Я вважаю за краще друге рішення, оскільки перше рішення не зупинить ігнорування файлів у binкаталозі, які знаходяться в підкаталогах, які не викликаються bin. Це може не мати значення у вашій ситуації.


2
Не працювало для мене. Я повинен мати .gitignore, як це, щоб він працював: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* Немає блочного коду в коментарях?
xlttj

1
Відповідь Тайлера має кращі рішення для одного файлу
Ярін

19

Один із прикладів офіційного git doc :

Приклад, щоб виключити все, окрім конкретного foo / bar каталогу (зверніть увагу на / * - без косої риски, підстановка також виключатиме все, що знаходиться у foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Для пояснення про провідну косу рису : Коли використовувати провідну косу рису в gitignore .


Дякую мільйон, це працювало для мене! Зауважте іншим, що тут важливий порядок рядків, наприклад, ви не можете мати! / Foo / bar перед / foo / *.
Iamsodarncool

13

Спробуйте дотримуватися останньої версії GIT.

*
!*/
!/path/to/your/dir/**

насправді це має бути! / шлях / до / ваш / реж / ** для останнього рядка
faham

@faham, так, тільки що додав.
Кірбі

11

Я думаю, що кращим способом було б прив’язати кожен візерунок до верхнього каталогу git, запустивши шаблон з косою рисою:

/*
!/public_html
!/.gitignore

Замість того, щоб ігнорувати всі файли, він буде ігнорувати лише файли верхнього рівня, а не ті, які є в каталозі, який ви не хочете ігнорувати.



5

спробуйте цю незрозумілу помилку git.

!bin**/**

Сподіваюся, це допомагає :)

Документи, що підтримують зразок помилок git

PS: спробуйте спочатку, перш ніж коментувати.


0

Мені довелося це зробити нещодавно:

*
!sub-dir/
!sub-dir/*

Я не впевнений, чому мені потрібні два рядки, щоб виключити одну папку, але це те, що працювало для мене та macos.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.