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?

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_"


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


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 ....


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


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

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.

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.