Git não observa novas exceções em .gitignore

3

[ NOTA : Este não é o usual "O Git ainda rastreia arquivos que acabei de adicionar ao .gitignore!" problema. Isso é o oposto disso.]

Eu tenho uma estrutura de diretório completa de um site em um repositório Git. O CMS que eu uso vem por padrão com um arquivo .gitignore:

# Ignore paths that contain user-generated content.
sites/*/files/
sites/*/private/

Observe que todos os diretórios sites / * / files estão excluídos. Mas a maneira que eu faço meus sites, há uma subpasta particular que eu quero ser incluído no repo. Então, depois de iniciar o meu repo com o .gitignore acima, eu o alterei para isso:

# Ignore paths that contain user-generated content.
sites/*/files/
!sites/*/files/content/
!sites/*/files/content/*
sites/*/private/

Pelo meu entendimento, os padrões negados que adicionei acima devem significar que os sites / * / files / content / e seu conteúdo estão incluídos no repo, mas o resto dos sites / * / arquivos é ignorado. E quando lembro de atualizar meu arquivo .gitignore antes de fazer meu primeiro commit, ele funciona como planejado.

Mas quando me esqueço de atualizar o .gitignore até mais tarde, como costumo fazer, não consigo fazer com que o Git adicione os novos arquivos sem forçá-lo a ignorar completamente o arquivo .gitignore. Eu corro isso:

> git add sites/default/files/content/

E recupere isso:

The following paths are ignored by one of your .gitignore files:
sites/default/files
Use -f if you really want to add them.
fatal: no files added

Por que sim, Git, esse diretório é ignorado na linha 2 do .gitignore, mas as linhas 3 e 4 dizem para abrir uma exceção para a pasta específica sobre a qual eu perguntei!

Estou ciente de que posso usar -f para adicioná-lo diretamente, mas depois tenho que fazer isso de novo e de novo em qualquer commit futuro que adicione arquivos a esse diretório.

Existem paginas todos mais de the web que falam sobre como atualizar .gitignore não faz o Git ignorar arquivos já rastreados, mas não consigo encontrar nada que fale sobre como ele não faz o Git rastrear recentemente arquivos com exceção.

Muitos lugares dizem que git update-index pode ser usado para resolver problemas como esse, mas não consigo fazer isso funcionar para mim. Tem cerca de um milhão de bandeiras possíveis, então talvez eu não tenha encontrado o caminho certo (ou combinação de vários).

TL; DR : Como posso fazer o Git observar novas exclusões no meu arquivo .gitignore?

    
por 75th Trombone 22.08.2012 / 23:36

2 respostas

2

Acho que esta resposta explica melhor. Negação só funciona para re-incluir arquivos que foram explicitamente ignorados por outra regra. Quando você ignora um diretório fechado, o Git nem mesmo aparece nele e, portanto, nunca vê, nem exclui explicitamente, o seu arquivo.

A resposta abaixo da acima fornece a solução: você precisa criar uma ou mais regras que criem um conjunto de caminhos que explicitamente exclua tudo o que você deseja excluir incluindo seu arquivo no ponto em que pode negar a exclusão para ele ou para qualquer um que contenha diretórios.

    
por 24.08.2012 / 17:03
1

O Google me trouxe aqui em busca de uma resposta para um problema semelhante. Tudo o que eu queria fazer é acompanhar um único arquivo de configuração em uma biblioteca não modificada.

Para conseguir isso eu tive que incluir / excluir todas as pastas até o arquivo que eu queria excluir:

vendor/* !vendor/tfox/ vendor/tfox/* !vendor/tfox/mpdf-port-bundle/ vendor/tfox/mpdf-port-bundle/* !vendor/tfox/mpdf-port-bundle/TFox/ vendor/tfox/mpdf-port-bundle/TFox/* !vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/ vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/* !vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/mpdf/ vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/mpdf/* !vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/mpdf/config_fonts.php

Esse conjunto de regras parece muito volumoso, mas parece ser a maneira correta de fazer isso.

    
por 28.03.2014 / 12:43