ігнорування будь-якого каталогу "bin" для git-проекту


1236

У мене така структура каталогів:

.git/
.gitignore
main/
  ...
tools/
  ...
...

Всередині основного та інструментів, а також будь-якого іншого каталогу, на будь-якому рівні, може бути каталог «бін», який я хочу ігнорувати (і я хочу ігнорувати все, що знаходиться під ним). Я спробував кожну з цих моделей у .gitignore, але жодна з них не працює:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

Хтось може мені допомогти? Перший зразок (той, на який я думаю, повинен працювати) працює чудово, якщо я це роблю:

/main/**/bin/**/*

Але я не хочу мати запис для кожного каталогу верхнього рівня, і мені не хочеться змінювати .gitignore кожен раз, коли я додаю новий.

Це в Windows за допомогою останнього msysgit.

EDIT: ще одне, є файли та каталоги, які мають підстроку "bin" у своїх іменах, я не хочу, щоб їх ігнорували :)


14
Можливо, хтось виявиться корисним: якщо у вас є декілька сховищ, і в кожному є один і той же файл .gitignore, ви можете помістити його в "загальне" місце і запустити> git config --global core.excludesfile ~ / .gitignore_global Останнім параметром є шлях до загального місця. PS Я новачок в git і не впевнений, чи це рекомендація "найкращої практики". Тому, будь ласка, дайте мені знати, якщо ви не хочете цього робити. Дякую.
Будда

**Синтаксис здається зараз (березень 2013, мерзотник 1.8.2) офіційно задокументовані: см моя відповідь нижче
VonC

2
Якщо хтось хоче прочитати найновішу версію фактичної сторінки керівництва, див. Сторінку gitignore (5) .

дружніший варіант, якщо вам набридло читати есе для інформації, що вартує
suazithustra

Відповіді:


1834

До версії 1.8.2 **не було особливого значення в .gitignore. Станом на 1.8.2 git підтримує **значення нуля або більше підкаталогів (див. Примітки до випуску ).

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

bin/

На manсторінці є приклад ігнорування каталогу, який називається fooза допомогою аналогічного шаблону.

Редагувати: Якщо у вашому індексі git вже є бінні папки, які ви більше не бажаєте відстежувати, їх потрібно видалити явно. Git не зупинить стеження стежок, які вже відстежуються лише тому, що вони зараз відповідають новому .gitignoreшаблону. Виконати видалення папки ( rm ) лише з індексу ( --cached ) рекурсивно ( -r ). Приклад командного рядка для папки root bin:

git rm -r --cached bin

72
Починаючи з git 1.8.2, git прийме **у .gitignoreфайли (джерело: 1.8.2
журнал

15
це binте саме bin/?
Нісба

29
@Nisba, вони різні, binігноруватимуть файли з іменем bin, тоді bin/як для каталогів з іменем bin
Рані Хейр

8
оскільки я перейнявся цим: ім'я папки в git-command IS чутливе до регістру :) "bin! = bin" - можливо, я пошкодую когось на кілька хвилин цим підказом :)
dba

1
У Windows10 ви не можете створити .gitignore файл, ви повинні створити gitignore.txt, а потім запустити ren gitignore.txt .gitignore в командному рядку, щоб створити цей файл
пошарпаний

463

.gitignoreВашої мрії , здається:

bin/

на верхньому рівні.


Дякую вам за допомогу, просто не забудьте перевірити приклад проігнорованих файлів: git checkout bin *
Chris Sim

1
помістити його в gitignore_global
μολὼν.λαβέ

@GAlexander, чому б хотіли глобально ігнорувати bin / каталоги? Вони часто мають змістовний зміст. І глобальне ігнорування не вплине на інших користувачів сховища.
Майкл Крелін - хакер

234

Я думаю, що це варто згадати для початківців git:

Якщо у вас вже зареєстрований файл, і ви хочете його проігнорувати, Git не буде ігнорувати файл, якщо ви додасте правило пізніше . У цих випадках потрібно спочатку зняти файл, виконавши таку команду у своєму терміналі:

git rm --cached

Тож якщо ви хочете додати, щоб ігнорувати деякі каталоги у вашому локальному сховищі (які вже існують) після редагування .gitignore, ви хочете запустити це у своєму кореневому реєстрі

git rm --cached -r .
git add .

Це, в основному, "оновить" локальні файли репо та неігнорованих файлів.

Подивитися:

http://git-scm.com/docs/git-rm ,

https://help.github.com/articles/ignoring-files/


якщо я зазвичай роблю git add -Aсвої зобов'язання, чи можу я використовувати це замість цього? і чи можу я замінити крапку на -A у першому рядку?
ajax333221

69

**Ніколи не належним чином працював і раніше, але так як мерзотник 1.8.2 (8 березня 2013) , це , здається, прямо згадується і підтримується:

Шаблони .gitignoreта .gitattributesфайли можуть мати **/як візерунок, що відповідає 0 або більше рівнів підкаталогу .

Наприклад, " foo/**/bar" відповідає " bar" в " foo" самому або в підкаталозі " foo".

У вашому випадку це означає, що цей рядок зараз може підтримуватися:

/main/**/bin/

46
[Bb]in/

відповідає як верхньому, так і нижньому регістру


2
[B]in/бути єдиною верхньою справою
Gank

Як дозволити Binігноруванню лише папки та дозволити binвиконувати git? [B]in/буде і вчиняти, Binі bin.
Ганк

4
Це слід зробити, @Gank: Bin/ !bin/
Marco G

34

Я не бачив його згадуваного тут, але це, мабуть, чутливе до регістру. Після того, як я змінився на / Бін, файли були проігноровані, як і очікувалося.


3
Це не відповідь на первісне питання, про яке явно говорили bin, ні Bin.
CB Bailey

49
Хоча це не відповідь, але додає повноти для інших, які шукають ту саму проблему (сам я зараз).
Джей

25

[Bb]in вирішить проблему, але ... Тут є більш широкий список речей, які слід ігнорувати (зразок списку від GitExtension):

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/

3
Примітка. Такі речі повинні бути у вашому глобальному gitignore (як правило, у вашому домашньому каталозі.) Проект gitignore повинен ігнорувати лише речі, характерні для вашого проекту (тобто .o файли для додатка C)
BraveNewCurrency

18

Якщо ви шукаєте чудовий глобальний .gitignoreфайл для будь-якого рішення Visual Studio (.NET) - рекомендую скористатися цим: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

AFAIK має найповніший .gitignoreдля .NET проектів.


5
Це насправді не відповідає на питання, але саме те, що я шукав.
Дейв

18

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

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

Крок 2. Переконайтесь, що набуває чинності

Якщо проблема все ще існує, це тому, що параметри в .gitignore можуть ігнорувати лише ті файли, які спочатку не відстежувалися . Якщо деякі файли вже включені до системи контролю версій, то зміна .gitignore недійсна. Щоб повністю вирішити цю проблему, вам потрібно відкрити консоль Git Bash або Package Manager (див. Скріншот нижче), щоб виконати наступні команди в кореневій папці сховища.

$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'

PM консоль Тоді питання буде повністю вирішено.


8

Буквально жодна з відповідей насправді не працювала для мене; єдиний, хто працював на мене, був (на Linux):

**/bin
(yes without the / in the end)

git version 2.18.0 

Це ігнорувало і всі папки, названі binв підкаталогах?
vinoeshvs

5

Як повідомлення;

Якщо ви думаєте, що .gitignoreце не працює таким чином (так додана foo/*папка до нього, але git statusвсе ще показує вміст (-и) папок як змінений або щось подібне), ви можете використовувати цю команду;

git checkout -- foo/*


3

для 2.13.3 і далі, написання просто біна у вашому файлі .gitignore має ігнорувати бін та всі його підкаталоги та файли

бункер


2

Додавання ** / bin / до файлу .gitignore зробило для мене трюк (Примітка: папка бін не додана до індексу).


1

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

Іншими словами, bin/буде відповідати каталогу binта шляхи під ним, але не буде відповідати звичайному файлу або символічному посиланню bin.


Якщо візерунок не містить косу рису , як, наприклад, у binGit трактує його як шаблон шаблону оболонки (жадібний). Тож найкраще було б використовувати просте /bin.

bin не було б найкращим рішенням для цієї конкретної проблеми.


Ви мали на увазі "почати з" a /?
vinoeshvs

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