Quais são as diferenças entre .gitignore e .gitkeep?

1927

Quais são as diferenças entre .gitignoree .gitkeep? Eles são a mesma coisa com um nome diferente ou ambos desempenham uma função diferente?

Parece que não consigo encontrar muita documentação .gitkeep.

Matty
fonte

Respostas:

3441

.gitkeep não está documentado, porque não é um recurso do Git.

O Git não pode adicionar um diretório completamente vazio . As pessoas que desejam rastrear diretórios vazios no Git criaram a convenção de colocar arquivos chamados .gitkeepnesses diretórios. O arquivo pode ser chamado de qualquer coisa; Git não atribui nenhum significado especial a esse nome.

Existe uma convenção concorrente de adicionar um .gitignorearquivo aos diretórios vazios para controlá-los, mas algumas pessoas acham isso confuso, pois o objetivo é manter os diretórios vazios, não ignorá-los; .gitignoretambém é usado para listar arquivos que devem ser ignorados pelo Git ao procurar arquivos não rastreados.

Wooble
fonte
414
Não seria uma solução melhor colocar um READMEarquivo no subdiretório vazio que contém um pouco de informações sobre para que esse subdiretório será usado? Parece confuso ter um arquivo chamado .gitkeepque não faz parte do git.
tamouse
423
@tamouse muitas vezes, o caminho do diretório vazio (por exemplo, nomes das pastas) é suficiente para expressar sua finalidade (exemplos: modelos / cache, upload / thumbs etc). Nesses casos, colocar um leia-me em cada um deles parece redundante.
Halil Özgür 31/01
16
pessoas que querem manter o controle de diretórios vazios devem ser indicando em um README que o diretório tem que ser criado ou criar os diretórios usando sua ferramenta de construção ou qualquer ferramenta (s) requerem o diretório de existir; /
32
@tamouse, @omouse: um .gitignorearquivo com duas linhas: *e !.gitignoreé mais que suficiente clareza para transmitir o que está acontecendo. Se for necessária mais elaboração, adicione um comentário na parte superior do arquivo usando a # sintaxe.
Droogans
63
Vale notar que a popular estrutura do Rails mudou ligeiramente essa convenção usando .keeparquivos em vez de .gitkeeppreservar essas pastas vazias, pois o git não é o único sistema de controle de origem que não rastreia pastas vazias. Mais detalhes aqui: github.com/rails/rails/issues/2800
Claudio Floreani
330

.gitkeepé apenas um espaço reservado. Como um arquivo fictício, o Git não esquecerá o diretório, pois o Git rastreia apenas os arquivos.


Se você deseja um diretório vazio e verifique se ele fica 'limpo' para o Git, crie um .gitignorecontendo as seguintes linhas:

# .gitignore sample
###################

# Ignore all files in this dir...
*

# ... except for this one.
!.gitignore

Se você deseja ter apenas um tipo de arquivo visível para o Git, aqui está um exemplo de como filtrar tudo, exceto .gitignore e todos os .txtarquivos:

# .gitignore to keep just .txt files
###################################

# Filter everything...
*

# ... except the .gitignore...
!.gitignore

# ... and all text files.
!*.txt

('#' indica comentários.)

sjas
fonte
3
Eu também gosto dessa prática. Se houvesse código fonte nestes diretórios não haveria necessidade de .gitkeep e geral é o conteúdo temp / cache / usuário que durante os testes seriam gerados de qualquer maneira fazendo com que você também tem que .gitignore esses arquivos
chrisan
1
Por que você precisa !na frente .gitignore? Isso é para escapar do ponto?
Will
7
@ Will - Não, ele !nega a parte a seguir, como geralmente acontece na programação.
S12
3
Não é necessário !.gitignoreinserir um arquivo git ignore, adicionar o arquivo e editá-lo ou forçar a adição com o conteúdo apropriado ("*" para ignorar tudo ou nada para simplesmente garantir que a pasta exista) exemplo adicional .
AD7six
13
No seu link: Since the git ignore file is already in the repo it is not necessary to not-ignore it - it is already tracked.------ Se não estiver, e você não fizer um complemento forte, poderá se esquecer. Em casos triviais, não há problema, mas se for um arquivo maior, você poderá ficar chateado. O uso !.gitignoreevita que você atire no seu pé. Eu prefiro, tendo me queimado no passado.
S28
125
.gitignore

é um arquivo de texto que compreende uma lista de arquivos em seu diretório que o git ignorará ou não adicionará / atualizará no repositório.

.gitkeep

Como o Git remove ou não adiciona diretórios vazios a um repositório, o .gitkeep é uma espécie de hack (não acho que seja oficialmente nomeado como parte do Git) para manter os diretórios vazios no repositório.

Basta fazer um touch /path/to/emptydirectory/.gitkeeppara adicionar o arquivo, e o Git agora poderá manter esse diretório no repositório.

Jim Munro
fonte
18
Você pode ter quantos .gitignores quiser, se não desejar especificar o caminho completo para todas as pastas todas as vezes.
sjas
1
Eu tento mencionar a lista de diretórios vazios no .gitkeeparquivo, mas ele não rastreará os diretórios vazios. Somente a pasta rastreará onde o .gitkeeparquivo existe. Por quê então ?
Pardeep Jain
2
.gitkeep não funciona como .gitignore. Não é uma lista de diretórios para se manter por perto. É apenas um arquivo vazio que vive no diretório que você deseja manter por perto. Ele pode ser chamado qualquer coisa que você quer .mantenha, etc. Então você pode ter um diretório como / foo / bar eo arquivo gitkeep será /foo/bar/.gitkeep
Jim Munro
@sjas como ter vários .gitignores evita que você especifique o caminho completo para todas as pastas todas as vezes? Acho que estou perdendo algo óbvio.
Willwsharp