Come posso aggiungere file senza punti (tutti i file senza estensione) al file gitignore?


111

Come dice il titolo, è possibile aggiungere "file senza punti" al file gitignore?

Immagino che questo si occupi di tutti quei fastidiosi file senza estensione.


2
Ci sono alcuni file senza estensione che non si desidera ignorare: README, LICENSEo COPYING, INSTALL, Makefileecc, loro però si può sempre forzare-aggiungono e poi sono seguiti
Jakub Narębski

@ JakubNarębski buon punto. L'ho incluso nella mia risposta per una maggiore visibilità.
VonC

possibile duplicato di gitignore senza file binari
Mad Physicist

Risposte:


121

Puoi provare una combinazione simile a:

*
!/**/
!*.*

Quella gitignoreregola di esclusione (un pattern negato ) dovrebbe ignorare tutti i file, tranne quelli con estensione.

Come indicato di seguito da Mad Physicist , la regola è:

Non è possibile includere nuovamente un file se una directory principale di quel file è esclusa. (*)
(*: a meno che non siano soddisfatte determinate condizioni in git 2.?+, vedi sotto)

Questo è il motivo per cui !/**/è importante (inserire in white list le cartelle principali in modo ricorsivo) se vogliamo inserire i file in white list.

Ho menzionato la stessa regola in casi simili come:


Come commenta Jakub Narębski , potresti non voler ignorare tutti i file senza estensione.

Il mio consiglio:

  • aggiungi prima il file senza estensione che conta
  • quindi modifica il tuo .gitignorecome mostrato sopra: i file già con versione non verranno ignorati (anche se non hanno un'estensione). Tutti gli altri verranno ignorati.

Per qualsiasi futuro file senza estensione di cui vorresti avere una versione:

git add -f -- myFile

Si noti che con git 2.9.x / 2.10 (metà 2016?), Potrebbe essere possibile includere nuovamente un file se una directory padre di quel file viene esclusa se non sono presenti caratteri jolly nel percorso reincluso .

Nguyễn Thái Ngọc Duy ( pclouds) sta cercando di aggiungere questa funzione:

Tuttavia, poiché una delle regole per la reinclusione era:

La parte della directory nelle regole di reinclusione deve essere letterale (cioè nessun carattere jolly)

Comunque qui non avrebbe funzionato.


1
La risposta è completamente corretta. Ma forse .gitignoresarebbe meglio **e !**.*. So che questo non fa differenza se l'asterisco è posizionato davanti, ma è più esplicito e
corretto

7
Nota: per lavorare con altre regole di esclusione, questo dovrà essere il primo set di regole nel tuo file .gitignore
Erik

Puoi anche reincludere alcuni file senza estensione, ad esempio con !Makefile. Attenzione che ho riscontrato problemi con questa soluzione in Git 1.7.1 mentre funzionava bene in 1.9.0. Nel mio caso l'aggiunta di un file nella directory principale ha funzionato bene, ma l'aggiunta di un file con un'estensione all'interno di una sottodirectory è stata mostrata come ignorata. Questo sembra essere dovuto al fatto che 1.7.1 non supportava **ancora il pattern, guarda qui !
mxmlnkn

1
**è stato aggiunto in Git 1.8.2. C'è qualche svantaggio rispetto all'uso al !*/posto di !/**/?
mxmlnkn

@TamaMcGlinn Sembra una regex: gitignore non supporta le regex.
VonC

50
*
!*/
!*.*

* dice a git di ignorare tutto.

!*/quindi non ignora tutto ciò che è una directory. Questo è fondamentale.

!*.* annulla tutti i file con estensione.

Senza la !*/regola, le directory senza un .nel nome non sarebbero elencate e nessuno dei file desiderati sarebbe aggiunto al di fuori della cartella principale.

Per riferimento, leggi queste due sezioni nella documentazione di .gitignore che si distinguono:

Un prefisso opzionale "!" che nega il pattern; qualsiasi file corrispondente escluso da un modello precedente verrà nuovamente incluso. Non è possibile includere nuovamente un file se una directory principale di quel file è esclusa. Git non elenca le directory escluse per motivi di prestazioni, quindi qualsiasi modello sui file contenuti non ha effetto, indipendentemente da dove siano definiti. Metti una barra rovesciata ("\") davanti al primo "!" per i modelli che iniziano con un letterale "!", ad esempio, "! important! .txt".

Se il pattern termina con una barra, viene rimosso ai fini della seguente descrizione, ma troverà solo una corrispondenza con una directory. In altre parole, foo / corrisponderà a una directory foo e ai percorsi sottostanti, ma non corrisponderà a un file normale oa un collegamento simbolico foo (questo è coerente con il modo in cui pathspec funziona in generale in Git).


1
Buona pesca. +1. Avevo dimenticato di aggiornare la mia risposta con quella regola che avevo usato di recente in altre risposte di mine. Ho aggiornato di conseguenza la mia risposta.
VonC

0

Nelle mie cartelle ci sono molti file con *.c, *.h, *.txt, *.csvestensioni ecc. E file binari senza alcuna estensione. Quindi avevo bisogno di ignorare tutti i file eseguiti *.c,*.he .gitignore, quindi questo funziona per me, .gitignoredall'esempio:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.