Existe alguma maneira de ver por que algum arquivo está sendo ignorado pelo git (ou seja, qual regra em um .gitignore
arquivo está causando o arquivo a ser ignorado)?
Imagine que eu tenho esse (ou um cenário muito mais complexo, com centenas de pastas e dezenas de .gitignore
arquivos:
/
-.gitignore
-folder/
-.gitignore
-subfolder/
-.gitignore
-file.txt
Se eu rodar, o git add folder/subfolder/file.txt
git pode reclamar por ter sido ignorado:
The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.
Existe alguma maneira de saber quais de todos os possíveis .gitignore
têm uma regra para ignorar esse arquivo e também mostrar a regra? Gostar:
The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.
Ou apenas:
$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt
git check-ignore
em breve (git1.8.5 / 1.9) terá uma--no-index
opção. Veja minha resposta abaixoGIT_TRACE_EXCLUDE=1 git status
em breve será uma maneira adicional de depurar.gitignore
regras. Veja minha resposta editada abaixoRespostas:
Veja a página de manual para mais detalhes.
A resposta original segue:
Atualmente, o git não fornece nada parecido com isso. Mas, depois de ver sua pergunta, pesquisei no Google e descobri que em 2009 esse recurso foi solicitado e parcialmente implementado . Depois de ler o tópico, percebi que não seria muito trabalhoso fazê-lo corretamente, então comecei o trabalho em um patch e espero que ele termine nos próximos dois dias. Vou atualizar esta resposta quando estiver pronta.
UPDATE: Uau, isso foi muito mais difícil do que eu esperava. As entranhas do
git
tratamento de exclusão são bastante enigmáticas. De qualquer forma, aqui está uma série quase finalizada de confirmações que se aplicam aomaster
ramo upstream de hoje . O conjunto de testes está 99% completo, mas ainda não terminei o manuseio da--stdin
opção. Espero que eu consiga gerenciar esse final de semana e depois envie meus patches para a lista de discussão git.Enquanto isso, eu definitivamente aceitaria os testes de qualquer pessoa capaz de fazê-lo - basta clonar no meu
git
garfo , verificar ocheck-ignore
ramo e compilá-lo normalmente.ATUALIZAÇÃO 2: Está feito! A versão mais recente está no github, conforme descrito acima, e enviei a série de patches para a lista de discussão do git para revisão por pares. Vamos ver o que eles pensam ...
ATUALIZAÇÃO 3: Depois de vários meses de hackers / revisões de patches / discussões / espera, estou muito satisfeito em poder dizer que esse recurso chegou ao
master
ramo do git e estará disponível no próximo lançamento (1.8.2, esperado 8 Março de 2013). Aqui está acheck-ignore
página do manual . Ufa, isso foi muito mais trabalho do que eu esperava!ATUALIZAÇÃO 4: Se você está interessado na história completa sobre como essa resposta evoluiu e o recurso foi implementado, confira o episódio nº 32 do podcast GitMinutes .
fonte
git check-ignore
não faz nada.git check-ignore
está presente e funcionando na 1.8.2. Se o comportamento não for o que você espera, sugiro que você (re) leia a página de manual e, se ainda não for, envie um relatório de erro adequado na lista de discussão do git. Apenas dizer que não faz nada não ajuda muito. Espero que você provavelmente o tenha executado em um arquivo não ignorado e esteja esperando alguma saída incorretamente (embora provavelmente adicionarei suporte--show-unmatched
ao--verbose
modo de saída no futuro).Atualize o git 2.8 (março de 2016):
Vejo " Uma maneira de validar o
.gitignore
arquivo "Isso é complementar ao
git check-ignore -v
descrito abaixo.Resposta original: setembro de 2013 (git 1.8.2 e 1.8.5 ou posterior):
git check-ignore
melhora novamente em git 1.8.5 / 1.9 (quarto trimestre de 2013) :Consulte commit 8231fa6 em https://github.com/flashydave :
fonte
Não consigo encontrar nada na página do manual, mas aqui está um script rápido e sujo que verificará seu arquivo em cada diretório pai para ver se ele pode ser adicionado ao git. Execute-o no diretório que contém o arquivo do problema como:
onde
STOP_DIR
é o diretório de nível superior do projeto Git eFILENAME
é o nome do arquivo com problema (sem um caminho). Ele cria um arquivo vazio com o mesmo nome em cada nível da hierarquia (se não existir) e tenta agit add -n
para ver se pode ser adicionado (ele limpa depois de si mesmo). Ele gera algo como:O script:
fonte
Para adicionar à resposta principal do uso
git check-ignore -v filename
(graças a BTW), descobri que meu arquivo .gitignore estava bloqueando tudo porque havia uma nova linha após um curinga, então eu tinha:* .sublime-project
como um exemplo. Acabei de remover a nova linha, e pronto! Foi consertado.
fonte