Як додати файли без крапок у них (усі файли без розширень) у файл gitignore?


110

Як говорить заголовок, чи можна додати "файли без крапок у них" у файл gitignore?

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


2
Є деякі extensionless файли , які ви не хочете ігнорувати: README, LICENSEабо COPYING, INSTALL, і Makefileт.д., але ви завжди можете примусово додати їх , а потім вони відслідковуються
Якуб Narębski

@ JakubNarębski хороший момент. Я включив це у свою відповідь для більшої наочності.
VonC

можливий дублікат gitignore без бінарних файлів
Mad

Відповіді:


121

Ви можете спробувати комбінацію, схожу на:

*
!/**/
!*.*

Це gitignoreправило виключення ( заперечений візерунок ) має ігнорувати всі файли, крім тих, що мають розширення.

Як згадано нижче по Mad Фізик , правило:

Неможливо повторно включити файл, якщо батьківський каталог цього файлу виключений. (*)
(*: якщо певні умови не виконуються в git 2.?+, див. нижче)

Ось чому !/**/важливо (білий-перелік батьківських папок рекурсивно), якщо ми хочемо передати файли з білим списком.

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


Як Якуб Narębski коментарі , ви не можете ігнорувати всі файли extensionless.

Моя порада:

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

Для будь-яких майбутніх файлів без розширень, які ви хочете версії:

git add -f -- myFile

Зауважте, що з git 2.9.x / 2.10 (середина 2016?), Можливо, можна повторно включити файл, якщо батьківський каталог цього файлу виключений, якщо в шлях повторно не включено підстановку .

Nguyễn Thái Ngọc Duy ( pclouds) намагається додати цю функцію:

Однак, оскільки одним із правил повторного включення було:

Частина каталогів у правилах повторного включення повинна бути буквальною (тобто ніяких символів)

Це як би там не працювало.


1
Відповідь цілком правильна. Але, можливо, краще .gitignoreбуло б **і !**.*. Я знаю, що це не має значення, якщо зірочка розміщена попереду, але вона є більш чіткою та здоровою з тим, як оболонки поводяться з
маючими символами

7
Примітка: для роботи з іншими правилами виключення це потрібно буде першим набором правил у вашому файлі .gitignore
Ерік

Ви також можете повторно включити певні файли без розширень, наприклад, з !Makefile. Будьте уважні, що у мене виникли проблеми з цим рішенням у Git 1.7.1, поки він працював чудово у 1.9.0. У моєму випадку додавання файлу до кореневого каталогу працювало чудово, але додавання файлу з розширенням всередині підкаталогу було показано ігнорованим. Це, мабуть, тому, що 1.7.1 ще не підтримував **схему, дивіться тут !
mxmlnkn

1
**додали в Git 1.8.2. Чи є якісь недоліки щодо використання !*/замість !/**/?
mxmlnkn

@TamaMcGlinn Це схоже на регулярний вираз: gitignore не підтримує регулярні виразки.
VonC

50
*
!*/
!*.*

* говорить git ігнорувати все.

!*/то розблоковує все, що є каталогом. Це є вирішальним.

!*.* unignores всі файли з розширенням.

Без цього !*/правила каталоги без .імені не будуть перераховані, і жоден із бажаних файлів не буде доданий поза кореневою папкою.

Для ознайомлення прочитайте ці два розділи у виділеній документації .gitignore :

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

Якщо візерунок закінчується косою рисою, вона видаляється з метою наступного опису, але вона знайде лише збіг з каталогом. Іншими словами, foo / буде відповідати директорії foo та шляхам під нею, але не збігатиметься із звичайним файлом або символьним foo (посилається на це).


1
Хороший улов. +1. Я забув оновити свою відповідь тим правилом, яке я нещодавно використовував в інших відповідях мін. Я відповідно оновив свою відповідь.
VonC

0

У моїх папках багато файлів із *.c, *.h, *.txt, *.csvрозширеннями тощо та бінарних файлів без будь-якого розширення. Тому мені потрібно було ігнорувати всі файли execpt *.c,*.hі .gitignore, Отже, це працює для мене з .gitignoreприкладу:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.