Как мне добавить файлы без точек (все файлы без расширений) в файл gitignore?

112

Как сказано в заголовке, можно ли добавить в файл gitignore «файлы без точек»?

Думаю, это позаботится обо всех надоедливых файлах без расширений.

Несчастный Кот
источник
2
Есть некоторые extensionless файлы , которые вы не хотите игнорировать: README, LICENSEили COPYING, INSTALL, и Makefileт.д., но вы всегда можете принудительно добавить их , а затем они отслеживаются
Якуб Narębski
@ JakubNarębski хорошее замечание. Я включил его в свой ответ для большей наглядности.
VonC
возможный дубликат gitignore без двоичных файлов
Mad Physicist

Ответы:

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) пытается добавить эту функцию:

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

Часть каталога в правилах повторного включения должна быть буквальной (т. Е. Без подстановочных знаков).

Все равно здесь это не сработало бы.

VonC
источник
1
Ответ совершенно правильный. Но, пожалуй, лучше .gitignoreбыло бы **и !**.*. Я знаю, что это не имеет значения, если звездочка помещена впереди, но это более четко и
понятно
7
Примечание: для работы с другими правилами исключения это должен быть первый набор правил в вашем файле .gitignore
Эрик,
Вы также можете повторно включить определенные файлы без расширений, например, с помощью !Makefile. Помните, что у меня возникли проблемы с этим решением в Git 1.7.1, в то время как оно нормально работало в 1.9.0. В моем случае добавление файла в корневой каталог работало нормально, но добавление файла с расширением внутри подкаталога было проигнорировано. Похоже, это связано с тем, что 1.7.1 еще не поддерживал **шаблон, см. Здесь !
mxmlnkn 07
1
**был добавлен в Git 1.8.2. Есть ли недостаток в использовании !*/вместо !/**/?
mxmlnkn 07
@TamaMcGlinn Это похоже на регулярное выражение: gitignore не поддерживает регулярные выражения.
VonC
51
*
!*/
!*.*

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

!*/затем отменяет игнорирование всего, что является каталогом. Это очень важно.

!*.* отменяет игнорирование всех файлов с расширением.

Без !*/правила каталоги без символа .в имени не будут перечислены, и ни один из желаемых файлов не будет добавлен за пределы корневой папки.

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

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

Если шаблон заканчивается косой чертой, он удаляется для целей следующего описания, но он обнаружит совпадение только с каталогом. Другими словами, foo / будет соответствовать каталогу foo и путям под ним, но не будет соответствовать обычному файлу или символической ссылке foo (это согласуется с тем, как pathspec в целом работает в Git).

Безумный физик
источник
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
Антраниг Авакян
источник