Git ігнорує підпапки


438

У мене є багато проектів у моєму .Net рішенні. Я хотів би виключити всі папки "bin / Debug" та "bin / Release" (та їх вміст), але все ж включати саму папку "bin" та всі вміщені в ній dll.

.gitignore за допомогою "bin /" ігнорує папки "Налагодження" та "Випуск", але також будь-які dll, що містяться в папці "bin".

"bin / Debug" або "bin / Release" у файлі .gitignore не виключає каталогів, якщо я повністю не кваліфікую шаблон ігнорування як "Solution / Project / bin / Debug" - що я не хочу робити як я потрібно буде включити цю повну схему для кожного проекту у моє рішення, а також додати його до будь-яких нових проектів, що додаються.

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


Навіщо додавати DLL? Якщо ви посилаєтесь на DLL-файли сторонніх розробників, може бути доцільним додати загальну папку, на яку всі ваші проекти потім посилаються.
Падді

6
Право Падді - якщо це сторонні DLL-файли, вони, ймовірно, повинні бути організовані далеко від вашого коду. Для мене, однак, це здається, що ви перевіряєте свої власні продукти побудови, що взагалі не є таким, яким ви хочете піти. Ви використовуєте git для відстеження інформації , яка повністю міститься в коді та конфігурації збірки. Продукти - це, ну, продукти. Відстеження їх задає проблеми - наприклад, що робити, якщо ви змінили код, але забули створити та перевірити нові продукти?
Каскабель

У мене виникла проблема з виключенням папок. Перепробував усе, включаючи точні зразки, написані тут, але без успіху. Нарешті я додав додатковий порожній рядок між шаблонами папок, і він працює. Можливо, проблема кодування. У мене Windows і це закодовано в UTF8.
RoadBump

Відповіді:


552

Ви пробували макіяж?

Solution/*/bin/Debug
Solution/*/bin/Release

З версією 1.8.2 git ви також можете використовувати **підстановку для відповідності будь-якому рівню підкаталогів:

**/bin/Debug/
**/bin/Release/

8
Він працює, за винятком випадків, коли є підпапка з іншим проектом, наприклад, Solution / Module / Project, тому я поки що додав / * / * / bin / Debug та / * / * / * / bin / Debug (для суб папки). Виглядає так, що вам потрібно додати підкаталог підстановки для кожного рівня в структурі каталогу.
Марсель

1
@Marcel: Ну, git, безумовно, не буде ігнорувати жодні файли, до яких ви цього не скажете - він ігнорує все, що відповідає подвійним знакам, ні більше, ні менше.
Каскабель

Я думаю, що подвійна зірка переступить межі каталогу, тобто: / ** / bin / Debug
Trent

11
@Taras: На жаль, це не так.
Tuukka Mustonen

2
У Visual Studio виникла помилка, пов’язана з **. Потрібно виправити до цього часу. посилання
Богач

106

Ви можете використовувати .gitignore на верхньому рівні, щоб ігнорувати всі каталоги в проекті з однойменною назвою. Наприклад:

Debug/
Release/

Це має бути оновлено негайно, щоб було видно, коли ви отримуєте статус git. Переконайтесь, що ці каталоги вже не додані до git, оскільки це замінить ігнори.


Те саме можна зробити, додавши шаблони у $GIT_DIR/.git/info/excludeфайл ОП .
Тім Геніган

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

1
Ще одна проблема з цим полягає в тому, якщо у вашому рішенні є проект під назвою Debug, який потім також буде проігноровано. Я думаю, що рішення - це комбінація всіх відповідей та коментарів - реструктуруйте рішення, щоб зберегти загальні або посилання на dll в іншій папці, потім ігноруючи "bin /" та / або використовуючи подстановочні символи.
Марсель

16
+1 Для коментаря щодо забезпечення каталогів, які ще не додані до git. Якщо вже додано до git, зробіть:git rm -rf DirectoryName/
levibostian

57

Питання не прошу про ігнорування всіх підкаталогів, але я не міг знайти відповідь в будь-якому місці, так що я відправлю його: */*.


1
Будь-який шанс ви могли б уточнити? Я спробував усілякі варіації цього питання, і не можу git addігнорувати каталог та всі файли у всіх підкаталогах цього каталогу. Я спробував dirname/, dirname/*, dirname/**, dirname/*/*, навіть в розпачі dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Кріс

3
*/*ігнорує всі підкаталоги, але не файли в поточному каталозі. Ігнорувати певний підкаталог - це звичайне використання gitignore. dirname, dirname/і dirname/*всі працюють для мене. Щось із цього каталогу вже було вчинено?
mgold

Це абсолютно новий репо - я видаляю весь .gitкаталог між спробами, git initпотім git add --all .(також пробував без --all), використовуючи 1.9.4.msysgit.1. Кожен непорожній підкаталог у моєму названому каталозі додається до індексу (перевірено в TortoiseGit та git status). Там немає відповідних рядків в .gitignoreзапуску , !але повинна бути яким - то конфлікт. Наразі вирішено, видаливши папки протягом add. Здогадайтесь, це щось, що потребує трохи більше копання, щоб надати необхідну інформацію для діагностики. Дякую, що запевнили мене, що я не розумію синтаксису.
Кріс

Що робити, якщо мені потрібно ігнорувати папку всередині папки, але не першу? Як і на форумі / ignorethisfolder / ... але він не повинен ігнорувати папку під назвою forum
Жан Карлос Ракоскі

Це не працює для мене в ігноруванні каталогу, ім'я якого починається з крапки. " /. " і ". * / *" також не працюють.
Тоні

44

Усі вищезазначені відповіді є дійсними, але те, що, на мою думку, не згадується, це те, що коли ви додасте файл із цього каталогу в репо, ви не можете ігнорувати той каталог / підкаталог, який містить цей файл (git ігнорує цю директиву ).

Щоб ігнорувати вже додані файли, запустіть

$ git rm --cached

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


12
git rm --cached, якщо ви хочете, щоб вони не відслідковувались / не мають значення для історії, але хочете зберегти файли недоторканими локально.
Ерік Реппен

29

Окрім введення правильних записів у файл .gitignore, якщо ви намагаєтесь проігнорувати щось, що вже було додано до репо, ви повинні зробити це git rm -r /path/to/dirі зробити це перед тим, як додати dir у свій .gitignore файл. В іншому випадку єдине, що git буде ігнорувати - це ваша директива про ігнорування.


19

Єдиний спосіб, коли я змусив це працювати на своїй машині, це зробити це так:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

Зауважте, як вам явно потрібно дозволити вміст для кожного рівня, який ви хочете включити. Тож якщо у мене є підкаталоги 5 глибоких тем, мені все одно потрібно це прописати.

Це з коментаря @ Yarin тут: https://stackoverflow.com/a/5250314/1696153

Це були корисні теми:

Я також спробував

*
*/*
**/**

і **/wp-content/themes/**

або /wp-content/themes/**/*

Нічого з того не працювало і для мене. Багато слідів і помилок!


13

Щоб виключити вміст і підкаталоги:

**/bin/*

Щоб виключити всі підкаталоги, але взяти вміст, додайте "/":

**/bin/*/

9

Щоб ігнорувати всі підкаталоги, ви можете просто скористатися:

**/

Це працює з версії 1.8.2 git.


8

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

bin/*/*

Якщо ви хочете ігнорувати лише окремі названі підпапки, ви можете зробити:

bin/Debug/*
bin/Release/*

нб. якщо binкаталог не знаходиться в корені вашого проекту (поряд з файлом .gitignore), то замість напр. bin/*/*вам може знадобитисяpath/to/bin/*/*

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