Como eu faço o Git "esquecer" de um arquivo que foi rastreado, mas agora está em .gitignore?

Existe um arquivo que é rastreado pelo git , mas agora o arquivo está na lista .gitignore .

No entanto, este arquivo continua a ser exibido no git status após editá-lo. Como você faz o git esquecer completamente disso?

4082
13 авг. conjunto Ivan 13 ago. 2009-08-13 22:23 '09 às 10:23 AM 2009-08-13 22:23
@ 22 respostas

.gitignore impedirá que arquivos não rastreados sejam adicionados (sem add -f ) ao conjunto de arquivos rastreados pelo git, mas o git continuará a rastrear quaisquer arquivos que já tenham sido rastreados.

Para parar de rastrear um arquivo, você precisa removê-lo do índice. Isto pode ser conseguido usando este comando.

 git rm --cached <file> 

A exclusão de um arquivo do cabeçalho de revisão ocorrerá no próximo commit.

NOTA: Embora isso não remova o arquivo físico do seu arquivo local, ele excluirá os arquivos das máquinas de outros desenvolvedores com o próximo git pull .

4329
13 авг. Resposta dada por CB Bailey 13 de agosto 2009-08-13 23:40 '09 às 11:40 pm 2009-08-13 23:40

Na seqüência de comandos abaixo, todos os itens do índice do Git serão excluídos (não do diretório de trabalho ou repo local), e então o índice do Git será atualizado, enquanto o Git será ignorado. Ps. Índice = Cache

Em primeiro lugar:

 git rm -r --cached . git add . 
border=0

Então:

 git commit -am "Remove ignored files" 
2209
30 сент. A resposta é dada por Matt Frear 30 set . 2013-09-30 16:51 '13 às 16:51 2013-09-30 16:51

O git update-index faz todo o trabalho para mim:

 git update-index --assume-unchanged <file> 

Nota Essa solução é virtualmente independente de .gitignore já que gitignore é destinado apenas a arquivos não rastreados.

change: desde que esta resposta foi publicada, uma nova opção foi criada, e isso deve ser preferido. Você deve usar o --skip-worktree que é destinado a arquivos monitorados modificados que o usuário não deseja mais corrigir, e salva --assume-unchanged para um melhor desempenho, para que o git não verifique o status de grandes arquivos monitorados. Veja levitrasi.net.site/questions/1817 / ... para mais informações ...

 git update-index --skip-worktree <file> 
830
27 нояб. a resposta é dada Konstantin 27 de novembro. 2013-11-27 14:24 '13 às 14:24 2013-11-27 14:24
 git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached git commit -am "Remove ignored files" 

Isso obtém uma lista de arquivos ignorados, remove-os do índice e, em seguida, confirma as alterações.

237
24 мая '14 в 1:29 2014-05-24 01:29 A resposta é dada a 24 de maio de 2014 às 1:29 2014-05-24 01:29

Eu sempre uso esse comando para excluir esses arquivos não reproduzíveis. Saída de linha única, estilo Unix, limpa:

 git ls-files --ignored --exclude-standard | sed 's/.*/" | xargs git rm -r --cached 

Ele lista todos os seus arquivos ignorados, substituídos por uma linha com aspas em vez de cada linha de saída para processar caminhos com espaços dentro e passar tudo para git rm -r --cached para remover paths / files / directories do índice.

62
19 июня '15 в 18:42 2015-06-19 18:42 Resposta foi dada por David Hernandez em 19 de junho '15 às 6:42 pm 2015-06-19 18:42

Se você não pode git rm arquivo monitorado, porque outras pessoas podem precisar dele (um aviso, mesmo se você pressionar git rm --cached quando alguém recebe essa alteração, seus arquivos serão excluídos em seu sistema de arquivos). Isso geralmente é feito devido à substituição do arquivo de configuração, credenciais de autenticação etc. Por favor, veja em https://gist.github.com/1423106 as maneiras pelas quais as pessoas contornaram o problema.

Resumindo:

  • Peça ao seu aplicativo para encontrar o arquivo config-overide.ini que está faltando e use-o no arquivo config.ini capturado (ou, como alternativa, localize ~ / .config / myapp.ini ou $ MYCONFIGFILE)
  • Corrija o arquivo config-sample.ini e ignore o arquivo config.ini, se necessário, crie um script ou um arquivo semelhante para copiar.
  • Tente usar a mágica clean / smudge gitattributes para aplicar e remover alterações, por exemplo, desfoque o arquivo de configuração como uma extração de uma ramificação alternativa e limpe o arquivo de configuração como uma extração de HEAD. Isso é uma coisa difícil, eu não recomendo para um usuário iniciante.
  • Salve o arquivo de configuração em sua ramificação de implementação dedicada, que nunca será mesclada com o mestre. Quando você deseja implantar / compilar / testar, você mescla com essa ramificação e obtém esse arquivo. Em essência, essa é a abordagem de borrar / limpar, com exceção do uso de políticas de mesclagem de pessoas e módulos adicionais do git.
  • Anti-recomendação: não use suposições sem mudanças, ela terminará apenas com lágrimas (porque uma falsa mentira em si pode levar a coisas ruins, como suas mudanças serão perdidas para sempre).
53
19 июля '12 в 3:08 2012-07-19 03:08 Resposta é dada por Seth Robertson em 19 de julho de 2012 às 3:08 2012-07-19 03:08

mova-o, bloqueie-o e, em seguida, devolva-o. Isso funcionou para mim no passado. Provavelmente há um jeito de fazer isso mais facilmente.

51
13 авг. Resposta dada por Joel Hooks 13 de agosto 2009-08-13 22:27 '09 às 10:27 pm 2009-08-13 22:27

Use isto quando:

1. Você deseja formatar muitos arquivos ou

2. Você atualizou seu arquivo gitignore

Link da fonte: http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Suponha que você já tenha adicionado / transferido alguns arquivos para o seu repositório git e os tenha adicionado ao seu.gitignore; esses arquivos ainda estarão presentes no seu índice de repositório. Neste artigo, vamos ver como se livrar deles.

Etapa 1: confirme todas as suas alterações.

Antes de continuar, certifique-se de que todas as alterações sejam confirmadas, incluindo o arquivo .gitignore.

Etapa 2. Remover tudo do repositório.

Para limpar seu repo, use:

 git rm -r --cached . 
  • rm - delete command
  • -r permitirá a exclusão recursiva
  • Em cache só irá remover arquivos do índice. Seus arquivos ainda estarão lá.

O comando rm pode ser implacável. Se você quiser tentar o que faz com antecedência, adicione -n ou --dry-run para verificar tudo.

Etapa 3: adicionar todos

 git add . 

Etapa 4: correção

 git commit -m ".gitignore fix" 

Seu repositório está limpo :)

Clique nas alterações no controle remoto para ver as alterações que também são efetivas lá.

40
22 апр. Resposta dada por Dheeraj Bhaskar em 22 Abr 2018-04-22 21:11 '18 às 21:11 2018-04-22 21:11

O que não funcionou para mim

(No Linux) Eu queria usar mensagens que sugerem a ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached . No entanto, (alguns dos) arquivos a serem excluídos tinham caracteres newline / LF / \n embutidos em seus nomes. Nenhuma das soluções:

 git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached git ls-files --ignored --exclude-standard | sed 's/.*/" | xargs git rm -r --cached 

lidar com esta situação (obter erros sobre arquivos não encontrados).

Portanto, sugiro

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 

Ele usa o argumento -z para ls-files e o argumento -0 usa xargs para usar com segurança / corretamente caracteres "desagradáveis" em nomes de arquivos.

Os estados da página de manual git-ws-files (1) :

Se a opção -z não for usada, os caracteres TAB, LF e barra invertida nos nomes de caminho serão representados como \ t, \ n e \\, respectivamente.

por isso acho que minha solução é necessária se os nomes dos arquivos contiverem algum desses caracteres.

EDIT: foi-me pedido para adicionar que --- como qualquer comando git rm - deve ser seguido por confirmar para tornar a remoção permanente, por exemplo. git commit -am "Remove ignored files" .

38
29 дек. A resposta é dada por JonBrave em 29 de dezembro. 2015-12-29 15:50 '16 às 15:50 2015-12-29 15:50

Eu fiz isso usando o ramo git do filtro . O comando exato que usei foi retirado da página man:

AVISO : isso excluirá o arquivo de todo o histórico.

 git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD 

Este comando recria todo o histórico de git rm executando o git rm antes de cada commit e, assim, descarta o arquivo especificado. Lembre-se de executar um backup antes de executar o comando, pois ele será perdido.

35
13 авг. a resposta é dada drrlvn 13 ago. 2009-08-13 22:35 '09 às 10:35 AM 2009-08-13 22:35
  • Atualize o arquivo .gitignore - por exemplo, adicione uma pasta para a qual você não deseja rastrear .gitignore .

  • git rm -r --cached . - excluir todos os arquivos rastreados, incluindo indesejados e indesejados. Seu código estará seguro se você salvá-lo localmente.

  • git add . - Todos os arquivos serão adicionados de volta, exceto aqueles especificados em .gitignore .


Dica @AkiraYamamoto chapéus para apontar na direção certa.

18
04 апр. a resposta é dada Chen_Wayne 04 abr. 2016-04-04 07:09 '16 às 7:09 2016-04-04 07:09

Eu acho que, talvez, o git não possa esquecer completamente o arquivo por causa de seu conceito (a seção "Imagens, não a Diferença" ).

Esse problema está ausente, por exemplo, ao usar o CVS. O CVS armazena informações como uma lista de alterações baseada em arquivos. As informações do CVS são uma coleção de arquivos e alterações feitas em cada arquivo ao longo do tempo.

Mas no git, toda vez que você comete ou salva o estado do seu projeto, ele basicamente tira uma foto de como são todos os seus arquivos no momento e armazena um link para esse instantâneo. Então, se você adicionou um arquivo uma vez, é sempre estará presente neste instantâneo.

Esses dois artigos foram úteis para mim:

git assume-nenhuma mudança vs skip-worktree e como ignorar as alterações nos arquivos rastreados usando git

Com base nisso, faço o seguinte se o arquivo já estiver sendo rastreado:

 git update-index --skip-worktree <file> 

Deste ponto em diante, todas as alterações locais neste arquivo serão ignoradas e não serão excluídas. Se o arquivo for alterado para um remoto, ocorrerá um conflito quando git pull . Pare não vai funcionar. Para resolver o problema, copie o conteúdo do arquivo para um local seguro e siga estas etapas:

 git update-index --no-skip-worktree <file> git stash git pull 

O conteúdo do arquivo será substituído pelo conteúdo excluído. Cole suas alterações de um lugar seguro no arquivo e execute novamente:

 git update-index --skip-worktree <file> 

Se todos que trabalham com o projeto executarem git update-index --skip-worktree <file> , não haverá problemas com pull . Essa solução é adequada para arquivos de configuração quando cada desenvolvedor possui sua própria configuração de projeto.

Isso não é muito conveniente para fazer sempre que um arquivo foi alterado em um computador remoto, mas pode protegê-lo de ser substituído pelo conteúdo remoto.

12
21 мая '17 в 18:12 2017-05-21 18:12 a resposta é dada Boolean_Type 21 de maio de '17 às 6:12 2017-05-05 18:12

Resposta Copiar / Colar: git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status

Este comando irá ignorar arquivos que já foram transferidos para o repositório Git, mas agora os adicionamos ao .gitignore .

5
19 нояб. A resposta é dada por youhans 19 de novembro 2018-11-19 14:21 '18 às 2:21 pm 2018-11-19 14:21

A resposta de Matt Fear foi a IMHO mais eficaz. A seguir, há apenas um script do PowerShell para aqueles que, somente no Windows, excluem arquivos de seu repositório git, que corresponde à sua lista de exceções.

 # Get files matching exclusionsfrom .gitignore # Excluding comments and empty lines $ignoreFiles = gc .gitignore | ?{$_ -notmatch "#"} | ?{$_ -match "\S"} | % { $ignore = "*" + $_ + "*" (gci -r -i $ignore).FullName } $ignoreFiles = $ignoreFiles| ?{$_ -match "\S"} # Remove each of these file from Git $ignoreFiles | % { git rm $_} git add . 
5
25 дек. A resposta é dada por Ameer Deen 25 de dezembro 2013-12-25 03:51 '13 às 3:51 2013-12-25 03:51

Mova ou copie o arquivo para um local seguro para que você não o perca. Então git rm file e commit. O arquivo será exibido se você retornar a uma dessas confirmações anteriores ou a outra ramificação onde não foi excluída. No entanto, em todos os commits futuros, você não verá o arquivo novamente. Se o arquivo estiver no git para ignorar, você pode movê-lo de volta para a pasta, e o git não o verá.

5
13 авг. Resposta dada por Apreche 13 de Agosto 2009-08-13 22:27 '09 às 10:27 pm 2009-08-13 22:27

Execute os seguintes passos alternadamente, tudo ficará bem.

1. Exclua arquivos erroneamente adicionados do diretório / repositório . Você pode usar o comando "rm -r" (para linux) ou apagá-los, navegando pelos diretórios.

2.Adicione arquivos / diretórios no arquivo gitignore e salve-o.

3. Agora, apague- os do cache do git usando estes comandos (se houver vários diretórios, apague-os um por um, re-emitindo este comando)

 git rm -r --cached path-to-those-files 

4. Agora, confirme e pressione , use esses comandos. Isso removerá esses arquivos do git remoto e fará com que o git pare de rastrear esses arquivos.

 git add . git commit -m "removed unnecessary files from git" git push origin 
3
20 сент. A resposta é dada por Shamsul Arefin Sajib 20 de setembro 2018-09-20 13:52 '18 às 1:52 pm 2018-09-20 13:52

O BFG é projetado especificamente para remover dados indesejados, como arquivos grandes ou senhas dos repositórios Git, de modo que ele tenha um sinalizador simples que removerá quaisquer arquivos históricos grandes (não no seu atual): "-strip-blobs-more-than-than

 $ java -jar bfg.jar --strip-blobs-bigger-than 100M 

Se você quiser especificar arquivos por nome, você também pode fazer isso:

 $ java -jar bfg.jar --delete-files *.mp4 

O BFG é 10-1000x mais rápido do que o ramo do filtro Git, e geralmente é muito mais fácil de usar - confira as instruções para uso completo e exemplos para mais detalhes.

Fonte: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

3
03 сент. Resposta dada por Meir Gerenstadt 03 set. 2017-09-03 15:37 '17 às 15:37 2017-09-03 15:37

Eu gostei da resposta do JonBrave, mas eu tenho diretórios de trabalho muito sujos que consertam -a, isso me assusta um pouco, então foi o que eu fiz:

git config --global alias.exclude-ignorado '! git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignorizado --exclude-padrão | xargs -0 git stage git stage.gitignore git commit -m "novo gitignore e remove arquivos ignorados do índice"

destruição:

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignored --exclude-standard | xargs -0 git stage git stage .gitignore git commit -m "new gitignore and remove ignored files from index" 
  • remover arquivos ignorados do índice
  • Stage.gitignore e os arquivos que você acabou de excluir.
  • para cometer
2
08 авг. a resposta é dada por Jay Irvine 08 ago. 2018-08-08 23:49 '18 às 11:49 PM 2018-08-08 23:49

Se você não quiser usar o CLI e trabalhar com o Windows, uma solução muito simples é usar o TortoiseGit , ele tem a ação "Delete (save local)" no menu, que funciona bem.

2
15 марта '18 в 14:04 2018-03-15 14:04 A resposta é dada por Pedi T. 15 de março de 18 às 14:04 2018-03-15 14:04

Isso não é mais um problema no último git (v2.17.1 no momento da escrita).

No .gitignore ignora os arquivos rastreados, mas é excluído. Você mesmo pode verificar isso executando o seguinte script. A expressão final do git status deve dizer "não fazer nada".

 # Create empty repo mkdir gitignore-test cd gitignore-test git init # Create a file and commit it echo "hello" > file git add file git commit -m initial # Add the file to gitignore and commit echo "file" > .gitignore git add .gitignore git commit -m gitignore # Remove the file and commit git rm file git commit -m "removed file" # Reintroduce the file and check status. # .gitignore is now respected - status reports "nothing to commit". echo "hello" > file git status 
1
13 июня '18 в 19:21 2018-06-13 19:21 resposta foi dada por Lloyd em 13 de junho '18 às 19:21 2018-06-13 19:21

No caso de uma DS_Store já comprometida:

 find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch 

Ignore-os:

 echo ".DS_Store" >> ~/.gitignore_global echo "._.DS_Store" >> ~/.gitignore_global echo "**/.DS_Store" >> ~/.gitignore_global echo "**/._.DS_Store" >> ~/.gitignore_global git config --global core.excludesfile ~/.gitignore_global 

Finalmente, faça uma correção!

0
23 апр. a resposta é dada por user7718859 23 abr. 2018-04-23 00:14 '18 às 00:14 2018-04-23 00:14

No mac:

 $ git --version git version 2.6.4 $ uname -a Darwin MUSRV186016-382 14.5.0 Darwin Kernel Version 14.5.0: Sun Sep 25 22:07:15 PDT 2016; root:xnu-2782.50.9~1/RELEASE_X86_64 x86_64 

1. Exclua os arquivos DS_Store da lista de arquivos rastreados por git no ramo foo:

 $ for file in $(git ls-tree -r foo --name-only | grep -i DS_Store); do git rm --cached $file; done 

2. Commit:

 $ git commit -m "Removed .DS_Store files" 

3. Verifique se os arquivos não são mais rastreados.

 $ git ls-tree -r foo --name-only # There should not be anything coming back 

4. Clique para removê-los do console:

 $ git push 
-5
13 янв. Resposta dada por Raphvanns Jan 13 2017-01-13 22:53 '17 às 10:53 2017-01-13 22:53

Outras questões sobre tags or Ask a Question