git-rm Como posso excluir um arquivo do git repo?





9 Answers

git rm file.txt remove o arquivo do repositório, mas também o exclui do sistema de arquivos local .

Para remover o arquivo do repositório e não excluí-lo do sistema de arquivos local, use:
git rm --cached file.txt

A situação exata abaixo é onde eu uso o git para manter o controle de versão do site da minha empresa, mas o diretório "mickey" era uma pasta tmp para compartilhar conteúdo privado com um desenvolvedor de CAD. Quando ele precisava de arquivos enormes, eu fiz um diretório privado, desvinculado e ftpd os arquivos lá para ele buscar via navegador. Esquecendo que fiz isso, mais tarde fiz um git add -A do diretório base do site. Posteriormente, o git status mostrou os novos arquivos que precisam ser confirmados. Agora eu precisava deletá-los do rastreamento e controle de versão do git ...

Exemplo de saída abaixo é do que acabou de acontecer comigo, onde eu inadvertidamente excluí o arquivo .003 . Felizmente, eu não me importo com o que aconteceu com a cópia local para .003 , mas alguns dos outros arquivos atualmente alterados foram atualizações que acabei de fazer para o site e seria épico ter sido excluído no sistema de arquivos local! "Sistema de arquivos local" = o site ao vivo (não é uma ótima prática, mas é a realidade) .

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

Update: Esta resposta está recebendo algum tráfego, então eu pensei em mencionar que minha outra resposta do Git compartilha alguns ótimos recursos: Esta página tem um gráfico que ajuda a desmistificar o Git para mim. O livro "Pro Git" está online e me ajuda muito.

git git-rm

Eu adicionei um arquivo chamado "file1.txt" ao git repo. Depois disso, dir1 alguns diretórios chamados dir1 e dir2 e os dir2 para o git repo.

Agora o "file1.txt" atual tem "file1.txt" , dir1 e dir2 .
Como posso excluir "file1.txt" sem afetar outros como dir1 e dir2 ?




Esta é a única opção que funcionou para mim.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Nota: Substitua * .sql pelo seu nome de arquivo ou tipo de arquivo. Tenha muito cuidado porque isso irá passar por todo commit e rasgar este tipo de arquivo.




Mais geralmente, a git help com pelo menos perguntas simples como esta:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index



git rm só irá remover o arquivo desta ramificação a partir de agora, mas ele permanece no histórico e o git se lembrará dele.

O jeito certo de fazer isso é com o git filter-branch , como outros já mencionaram aqui. Ele irá reescrever cada commit no histórico do branch para deletar esse arquivo.

Mas, mesmo depois de fazer isso, o git pode se lembrar disso porque pode haver referências a ele em reflog, remotes, tags e outros.

Se você quiser destruí-lo completamente em um passo, eu recomendo que você use o git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

É fácil, apenas git forget-blob file1.txt .

Isto irá remover todas as referências, fazer o git filter-branch e, finalmente, executar o coletor de lixo git gc para se livrar completamente deste arquivo em seu repo.




Para excluir um arquivo específico

git rm filename

Para limpar todos os arquivos untracked de um diretório recursivamente em um único tiro

git clean -fdx




No meu caso eu tentei remover o arquivo no github depois de alguns commits mas poupe no computador

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

e depois esse arquivo foi ignorado




Eu tentei muitas das opções sugeridas e nenhuma apareceu para trabalhar (não vou listar os vários problemas). O que acabei fazendo, que funcionou, foi simples e intuitivo (para mim) foi:

  1. mover todo o repositório local em outro lugar
  2. clonar o repo novamente do master para a sua unidade local
  3. Copie os arquivos / pasta de sua cópia original em # 1 de volta para o novo clone de # 2
  4. Certifique-se de que o arquivo grande com problema não esteja lá ou seja excluído no arquivo .gitignore
  5. faça o usual git add / git commit / git push



Eu tenho arquivos obj e bin que acidentalmente chegaram ao repositório que eu não quero poluir minha lista de 'arquivos alterados'

Depois que eu notei que eles foram para o controle remoto, eu os ignorei adicionando isso ao .gitignore

/*/obj
/*/bin

Problema é que eles já estão no controle remoto, e quando eles são alterados, eles aparecem como alterados e poluem a lista de arquivos alterados.

Para parar de vê-los, você precisa excluir a pasta inteira do repositório remoto.

Em um prompt de comando:

  1. CD para a pasta repo (ou seja, C:\repos\MyRepo )
  2. Eu quero excluir o SSIS \ obj. Parece que você só pode excluir no nível superior, então agora você precisa de CD no SSIS: (ou seja, C:\repos\MyRepo\SSIS )
  3. Agora digite a mágica incantation git rm -r -f obj
    • rm = remove
    • -r = remover recursivamente
    • -f = significa força, porque você realmente está falando sério
    • obj é a pasta
  4. Agora execute git commit -m "remove obj folder"

Recebi uma mensagem alarmante dizendo 13 arquivos alterados 315222 exclusões

Então, porque eu não queria ter que procurar a linha CMD, entrei no Visual Sstudio e fiz um Sync para aplicá-lo ao remoto




Incase se você não arquivar em seu repositório local, mas em git repo, em seguida, basta abrir o arquivo no git repo através da interface web e encontrar o botão Excluir no canto direito da interface. Clique aqui, para ver a interface Excluir opção




Related


Tags

git   git-rm