Яка різниця між каталогом ігнорування Git та каталогом / *?


108

Мене бентежить питання про те, який правильний спосіб ігнорувати вміст каталогу в git.

Припустимо, у мене є така структура каталогу:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

У чому різниця між цим:

www

І це?

www/*

Причиною, що я задаю це питання, є: У git, якщо каталог порожній, git не буде включати такий порожній каталог у сховище. Тому я намагався вирішити, що додати додатковий .gitkeep файл під каталог, щоб він не був порожнім. Коли я намагався це рішення, якщо у файлі .gitignore я пишу, як нижче:

www
!*.gitkeep

Це не працює (мій намір - ігнорувати весь вміст під www, але зберігати каталог). Але якщо я спробую наступне:

www/* 
!*.gitkeep

Тоді це працює! Тому я думаю, що він повинен мати деякі відмінності між двома підходами.


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

Відповіді:


203

Там ви відмінність між www, www/і www/*.

В основному з документації та моїх власних тестів, wwwзнайдіть збіг з файлом або каталогом, www/збігається лише з каталогом, тоді як www/*відповідає каталогам і файлам всередині www.

Я лише обговорюватиму відмінності між www/і www/*тут, оскільки відмінності між wwwі www/очевидні.

Бо www/git ігнорує сам каталог www, а значить, git навіть не загляне всередину. Але для www/*, git перевіряє всі файли / папки всередині wwwі ігнорує їх усі за допомогою шаблону *. Здається, це призводить до тих же результатів, оскільки git не відстежує порожню папку, wwwякщо всі її дочірні файли / папки ігноруються. І справді результати не матимуть ніякої різниці у випадку з ОП www/або www/*окремими. Але це робить відмінності, якщо він поєднується з іншими правилами.

Наприклад, що робити, якщо ми хочемо лише включити, www/1.txtале ігнорувати всі інші всередині www?

Наступне .gitignoreне працюватиме.

www/
!www/1.txt

Хоча наступні .gitignoreроботи, чому?

www/*
!www/1.txt

Для першого, git просто ігнорує каталог wwwі навіть не загляне всередину, щоб www/1.txtзнову включити його. Перше правило виключає батьківський каталог, wwwале ні www/1.txt, і внаслідок цього www/1.txtне може бути " включено знову ".

Але для останнього, git спочатку ігнорує всі файли / папки під www, а потім знову включає один з них, який є www/1.txt.

У цьому прикладі наступні рядки в документації можуть допомогти:

Необов’язковий префікс "!" що заперечує візерунок; будь-який відповідний файл, виключений за попереднім шаблоном, знову буде включений. Неможливо повторно включити файл, якщо батьківський каталог цього файлу виключений.


Чи не думаєте ви , що www/1.txtі тоді www/буде робити те ж саме, що другий підхід ...
Навід Батт

8

Я просто аналізую документацію, і наскільки я можу сказати, вони відрізняються лише більш досконалими зразками, наприклад

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

Я зробив тест вище, і якщо замінити !/fooз !/foo/*, ви дійсно отримаєте інший результат.

Примітка

foo

Виключить будь-який файл foo, але

foo/

виключатимуть лише каталоги з ім'ям foo.


3

Крім ідеально хороших відповідей, які ви вже отримали, слід зазначити, що ви можете мати .gitignoreбудь-де у своєму проекті, включаючи вкладені папки.

Так що якщо ви хочете , щоб ігнорувати всі файли всередині www, але whant wwwпапки для версіруются, замість того , щоб використовувати порожній .gitkeep, .dummyабо будь-яке ім'я ви вибрали, чому б не використати .gitignoreтам, кажучи , щоб ігнорувати всі файли?

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

У корені .gitignore(a) ви нічого не говорите про wwwпапку та її вміст.

У пункті www/.gitignore(b) ви вказуєте наступне:

# ignore all files in this folder except this .gitignore
*
!.gitignore

Таким чином все виглядає більш організовано (як мінімум, для мене).


1

Щоб ігнорувати все в каталозі, окрім точкових файлів, ви можете використовувати наступний глобульний шаблон у своєму .gitignore:

www/[^.]*

Тому зайвих не потрібно .gitignore, просто додайте .keepфайл у свій wwwкаталог.

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