Existe uma maneira de dizer ao git para incluir apenas determinados arquivos em vez de ignorar certos arquivos?

165

Meus programas geralmente geram grandes arquivos de saída (~ 1 GB) que eu não quero fazer backup no repositório git. Então, ao invés de poder fazer

git add .

Eu tenho que fazer algo como

git add *.c *.cc *.f *.F *.C *.h *.cu

que é um pouco complicado ...

Sinto-me bastante confiante de que poderia escrever um script perl quicky no conteúdo do diretório em .gitignore e, em seguida, remover arquivos com base em um arquivo .gitinclude (ou algum nome semelhante), mas isso parece um pouco tolo. Existe uma maneira melhor?

Daisy Sophia Hollman
fonte

Respostas:

230

Eu não precisei tentar isso sozinho, mas, pela minha leitura do TFM , parece que um padrão negado faria o que você deseja. Você pode substituir entradas no .gitignore por entradas negadas posteriormente. Assim, você poderia fazer algo como:

*.c
!frob_*.c
!custom.c

Para que ele ignore todos os arquivos .c, exceto custom.ce qualquer coisa que comece com "frob_"

TED
fonte
20
Obrigado, TED Isso funcionou. Tudo o que eu precisava fazer era iniciar o arquivo .gitignore com * e, em seguida, listar todos os meus padrões de arquivo incluídos, prosseguidos por um ponto de exclamação.
Daisy Sophia Hollman
8
E as pastas? Não consigo encontrar uma maneira de incluir pastas e arquivos dentro, negando uma regra.
Marcio Cruz
4
Sobre pastas, verifique stackoverflow.com/questions/12799855/…
uzsolt
2
muito agradável. Eu estou usando isso para ter um repositório na minha pasta pessoal para coisas como vimrc e bashrc
Martin Capodici
1
O @uzsolt não funciona se você deseja incluir uma pasta específica. veja stackoverflow.com/questions/987142/…
DiCaprio
73

crie um arquivo .gitignore no seu repositório e você deseja rastrear apenas os arquivos c e ignorar todos os outros arquivos e, em seguida, adicione as seguintes linhas a ele ....

*
!*.c

'*' ignorará todos os arquivos

e! negará que os arquivos sejam ignorados .... então, aqui estamos pedindo ao git para não ignorar os arquivos c ....

Vineel Kumar Reddy
fonte
Você também precisa .*de arquivos ocultos?
trusktr
2
O mesmo *é um curinga ., portanto, os arquivos ocultos também são ignorados, mas todos os arquivos ocultos que terminam em .csão incluídos.
Rohmer # 2
2
Usando esse método, acho que os arquivos das subpastas também são ignorados. Verifique isso para obter mais detalhes stackoverflow.com/a/11853075/739436
Stelian
1
Eu usei esse método no meu diretório home apenas para controlar o meu .bashrc e, por exemplo .bash_history *seguido por !.bash*no arquivo .gitignore
user5359531
1
Você pode precisar *.*nas janelas - veja a resposta por @Smaranjit Maiti
Martin Capodici
13

A melhor solução para conseguir isso

crie um .gitignorearquivo no repositório roote, se você quiser incluir apenas um .carquivo, precisará adicionar as linhas abaixo ao .gitignorearquivo

*.*
!*.c

isso incluirá todos os .carquivos do diretório e subdiretório recursivamente.

usando

*
!*.c

não funcionará em todas as versões do git.

Testado em

git versão 2.12.2.windows.2

Smaranjit
fonte
2
Sim, eu tive o mesmo problema *e tive que usar *.*. Esta é no Windows usando gitbash e versão git 2.9.0.windows.1
Martin Capodici
2

Se você precisar ignorar arquivos, mas não um arquivo específico dentro de um diretório, aqui está como eu fiz isso:

# Ignore everything under "directory"
directory/*
# But don't ignore "another_directory"
!directory/another_directory
# But ignore everything under "another_directory"
directory/another_directory/*
# But don't ignore "file_to_be_staged.txt"
!directory/another_directory/file_to_be_staged.txt
gzfrancisco
fonte
0

Tarde para a festa, mas minha solução seria ter um diretório para arquivos de origem e um diretório diferente para executáveis ​​e saída do programa, algo como isto:

+ .git
|    (...)
+ bin
|    my_exe.exe
|    my_output.txt
+ src
     some_file.c
     some_file.h 

... e adicione apenas o material src/ao meu repositório e ignore bin/completamente.

Christian Severin
fonte