Como ignorar arquivos que estão no repositório?

92

Eu tenho um arquivo (config.php), que já está confirmado no repositório Git, mas quero ignorar localmente, ou seja, quero que esse arquivo permaneça no repositório, mas forço o Git a ignorar quaisquer alterações nele.

Eu coloquei o arquivo em .gitignore, mas ele ainda está marcado como alterado e Git ainda está tentando submeter as alterações a ele, toda vez que eu faço o commit de algo. Alguma ideia, o que estou perdendo ou fazendo de errado?

prcaen
fonte
adicione o seu arquivo .gitignore - assim poderemos ver quaisquer problemas relacionados a ele.
Lars

Respostas:

188

Se o arquivo ainda estiver sendo exibido no status, mesmo que esteja no .gitignore, certifique-se de que ele ainda não tenha sido rastreado.

git rm --cached config.php

Se você deseja apenas ignorá-lo localmente, também pode torná-lo ignorado pelo status do git:

git update-index --assume-unchanged config.php
VonC
fonte
1
OK, obrigado! Se eu mesclar meu branch com outro, este arquivo pode causar alguns problemas?
prcaen
1
@ Nimbus147: não deve ser um problema e quaisquer alterações nesse arquivo serão ignoradas (ou seja, não adicionadas / confirmadas).
VonC
se usar SmartGit, você deve usar remove para fazer isso.
Omid-RH
1
Existe uma maneira de forçar update-index --assume-unchangedno ramo remoto? Gostaria de manter o arquivo no repositório, mas não posso ser alterado por outros, mas, além disso, não está disponível para o estágio.
p014k
1
@ p014k Não que eu saiba. Para esse tipo de arquivo, mantenho a versão com um nome diferente e, em seguida, uso um driver de arquivador de conteúdo para gerar automaticamente o arquivo correto (privado) quando necessário. Esse filtro não estaria ativo no palco, por exemplo. Consulte stackoverflow.com/a/54454356/6309 e seu link associado.
VonC de
5

Ignorar arquivo com check-in:

git update-index --assume-unchanged file

Reverter

git update-index --no-assume-unchanged file

Reverter tudo

git update-index --really-refresh 
shiva kumar
fonte
Útil. Reverter um arquivo funcionou, mas reverter todos não.
Adem Tepe
4

Se o arquivo já estiver no repositório e, portanto, na área Índice / Preparação, uma atualização para .gitignore não mudará essa situação - ela continuaria sendo confirmada.

Para remover o arquivo da área de Índice / Teste, use git rm <file>.

Philip Oakley
fonte
E se o arquivo estiver no repositório, mas ainda não tiver sido testado? Estou tentando ignorar os arquivos * .log, mas ainda os vejo em "Alterações". Eu quero ignorar tudo, o que fazer?
Sandra K
@SandraK se houver uma versão mais antiga desse arquivo (caminho / nome do arquivo) já no repo no último commit, então ele é considerado rastreado - o 'índice' terá esse arquivo em seus registros, e assim statuscontinuará a informá-lo sobre essas mudanças. Se você deseja ignorar os arquivos * .log, para os arquivos previamente anexados e atualmente não rastreados, você precisa git rm *.logatualizar seu arquivo .gitignore. Verifique primeiro se alguns arquivos de log são realmente importantes ... É fácil esquecer aquele especial ;-)
Philip Oakley
-3

Depois que um arquivo é listado no .gitignore, você não pode alterá-lo.

Assim, você pode remover o arquivo da lista em um commit, enviar as alterações no próximo, e então adicionar novamente o arquivo à lista de ignorados em um terceiro commit depois.

O que eu normalmente faço é dividir o arquivo em dois, um que é permitido e eu posso mudar, que inclui o segundo arquivo se ele existir, então os desenvolvedores podem fazer mudanças de configuração no arquivo ignorado opcionalmente.

Erikvold
fonte
1
" Uma vez que um arquivo é listado no .gitignore, você não pode alterá-lo " - você pode esclarecer, o que você quer dizer? Eu tenho muitos arquivos em muitos dos meus programas .gitignoree estou constantemente alterando esses arquivos! É a primeira vez, ouço alguém dizer, que depois de adicionar o arquivo .gitignore, não posso alterá-lo.
trejder 01 de
1
Ele está realmente errado. Você pode mudá-los. Git simplesmente não os carrega, ou mesmo dá a você a opção de carregá-los.
David