Remover um arquivo existente de um repositório Git

Respostas:

143

Apenas para dar a resposta completa de uma só vez:

  1. from klemens: você precisa adicionar o arquivo em .gitignorealgum lugar acima do arquivo indesejado no repositório. ie

    $ cd $ cat >> .gitignore development.log Cd

  2. De. narebski: Em seguida, você precisa remover o arquivo do repositório executando " git rm --cached <file>e confirmando esta remoção"

Se você também esperava fazer com que o repositório parecesse nunca ter rastreado esse arquivo, isso é muito mais complicado e altamente desencorajado, pois não apenas cria novos commit para cada commit em sua história, destruindo a interoperabilidade de maneira desagradável. entre outras pessoas que clonaram seu repositório, mas isso também deixa todos os commit não testados (supondo que você teste seus commit antes de realizá-los).

Com essa ressalva, a ferramenta que você está procurando se esse é seu objetivo filter-branch. O primeiro exemplo faz exatamente o que estou descrevendo.

Tim Visher
fonte
3
O uso do git rm --cached parece não apenas removê-lo da ramificação, mas quando puxo para outro sistema, ele exclui os arquivos fisicamente naquele sistema. Alguma idéia do que está acontecendo lá?
biagidp
2
Em resposta ao exposto: acredito que o problema estava no fato de eu não ter o .gitignore instalado no sistema alternativo antes de efetuar as alterações, portanto, a exclusão removeu a cópia local. Pelo menos essa é a teoria #
2223 biagidp
53

Para parar de rastrear o arquivo, basta usar git rm --cached <filename>.

Mas, como indicado pelas outras pessoas aqui, adicionar o arquivo ao .gitignore pode impedir que você o adicione acidentalmente novamente mais tarde.

kusma
fonte
1

adicione o arquivo gitignore.

consulte http://git-scm.com/docs/gitignore

fetzig
fonte
13
Esta é apenas metade da resposta. .gitignoreas entradas não se aplicam a arquivos que já estão sendo rastreados.
CB Bailey
10
A segunda parte é git rm --cached <file>e, em seguida, confirma essa remoção.
Jakub Narębski
1
Por que não existe um comando simples para o git reavaliar todos os arquivos rastreados atualmente de acordo com o arquivo .gitignore atual? ... ou isso está exercendo muito senso comum? : p
Alexander - Reinstate Monica