Como adiciono arquivos sem pontos (todos os arquivos sem extensão) ao arquivo gitignore?


111

Como o título diz, é possível adicionar "arquivos sem pontos" ao arquivo gitignore?

Eu imagino que isso iria cuidar de todos aqueles arquivos sem extensão incômodos.


2
Existem alguns arquivos sem extensão que você não quer ignorar: README, LICENSEou COPYING, INSTALL, Makefileetc., embora você sempre pode forçar a adicioná-los e então eles são monitorados
Jakub Narębski

@ JakubNarębski bom ponto. Eu incluí na minha resposta para mais visibilidade.
VonC

Respostas:


121

Você pode tentar uma combinação semelhante a:

*
!/**/
!*.*

Essa gitignoreregra de exclusão (um padrão negado ) deve ignorar todos os arquivos, exceto aqueles com uma extensão.

Conforme mencionado abaixo pelo Mad Physicist , a regra é:

Não é possível incluir novamente um arquivo se um diretório pai desse arquivo for excluído. (*)
(*: a menos que certas condições sejam atendidas no git 2.?+, veja abaixo)

É por isso que !/**/ é importante (colocar as pastas-pai na lista branca recursivamente) se quisermos colocar os arquivos na lista branca.

Mencionei a mesma regra em casos semelhantes, como:


Como Jakub Narębski comenta , você pode não querer ignorar todos arquivos sem extensão.

Meu conselho:

  • adicione primeiro o arquivo sem extensão que importa
  • em seguida, edite o seu .gitignoreconforme mostrado acima: os arquivos já versionados não serão ignorados (mesmo se não tiverem uma extensão). Todos os outros serão ignorados.

Para quaisquer arquivos futuros sem extensão que você deseja criar:

git add -f -- myFile

Observe que com git 2.9.x / 2.10 (meados de 2016?), Pode ser possível incluir novamente um arquivo se um diretório pai desse arquivo for excluído se não houver curinga no caminho incluído novamente .

Nguyễn Thái Ngọc Duy ( pclouds) está tentando adicionar este recurso:

No entanto, uma vez que uma das regras para a reinclusão foi:

A parte do diretório nas regras de reinclusão deve ser literal (ou seja, sem curingas)

Isso não teria funcionado aqui de qualquer maneira.


1
A resposta está totalmente correta. Mas talvez um melhor .gitignorefosse **e !**.*. Eu sei que isso não faz diferença se o asterisco for colocado na frente, mas é mais explícito e consistente com a forma como as conchas lidam com curingas ...
Willem Van Onsem

7
Observação: para trabalhar com outras regras de exclusão, este precisará ser o primeiro conjunto de regras em seu arquivo .gitignore
Erik

Você também pode incluir novamente certos arquivos sem extensão, por exemplo, com !Makefile. Fique atento, pois tive problemas com esta solução no Git 1.7.1 enquanto funcionava bem no 1.9.0. No meu caso, adicionar um arquivo no diretório raiz funcionou bem, mas adicionar um arquivo com uma extensão dentro de um subdiretório foi mostrado como ignorado. Isso parece ser porque 1.7.1 não suportava o **padrão ainda, veja aqui !
mxmlnkn

1
**foi adicionado no Git 1.8.2. Existe alguma desvantagem em relação ao uso em !*/vez de !/**/?
mxmlnkn

@TamaMcGlinn Isso se parece com um regex: gitignore não oferece suporte para regexes.
VonC

50
*
!*/
!*.*

* diz ao git para ignorar tudo.

!*/em seguida, remove a ignorar qualquer coisa que seja um diretório. Isso é crucial.

!*.* cancela a ignorar todos os arquivos com uma extensão.

Sem a !*/regra, os diretórios sem um .no nome não seriam listados e nenhum dos arquivos desejados seria adicionado fora da pasta raiz.

Para referência, leia estas duas seções na documentação .gitignore que se destacam:

Um prefixo opcional "!" que nega o padrão; qualquer arquivo correspondente excluído por um padrão anterior será incluído novamente. Não é possível incluir novamente um arquivo se um diretório pai desse arquivo for excluído. Git não lista diretórios excluídos por motivos de desempenho, portanto, quaisquer padrões nos arquivos contidos não têm efeito, não importa onde sejam definidos. Coloque uma barra invertida ("\") antes do primeiro "!" para padrões que começam com um "!" literal, por exemplo, "! important! .txt".

Se o padrão terminar com uma barra, ele será removido para o propósito da descrição a seguir, mas apenas encontraria uma correspondência com um diretório. Em outras palavras, foo / irá corresponder a um diretório foo e caminhos abaixo dele, mas não irá corresponder a um arquivo regular ou um link simbólico foo (isso é consistente com a maneira como o pathspec funciona em geral no Git).


1
Boa pegada. +1. Eu tinha esquecido de atualizar minha resposta com aquela regra que usei recentemente em outras respostas de minas. Eu atualizei minha resposta de acordo.
VonC

0

Em minhas pastas, há muitos arquivos com *.c, *.h, *.txt, *.csvextensões etc. e arquivos binários sem qualquer extensão. Então, eu precisava ignorar todos os arquivos execpt *.c,*.he .gitignore, então, isso funciona para mim, a partir do .gitignoreexemplo:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.