Como posso excluir um arquivo de um repositório Git?

1924

Eu adicionei um arquivo nomeado "file1.txt"a um repositório Git. Depois disso, eu o comprometi, adicionei alguns diretórios chamados dir1e dir2, e os comprometi ao repositório Git.

Agora o repositório atual tem "file1.txt", dir1e dir2. Como posso excluir "file1.txt"sem afetar os outros, como dir1e dir2?

webminal.org
fonte
85
git rmé a resposta certa, mas lembre-se de que o arquivo ainda estará lá no histórico. Se você deseja remover um arquivo porque possui informações confidenciais, precisará fazer algo mais drástico. (Mudar a história, especialmente para o conteúdo que você já tenha empurrado, é uma ação drástica, e deve ser evitado, se possível.)
Keith Thompson
8
Nota: no GitHub, agora você pode excluir diretamente um arquivo da interface da web (sem precisar nem clonar o repositório). Veja minha resposta abaixo .
VonC
4
@KeithThompson, que medidas seriam essas se eu quisesse desesperadamente fazer isso?
lessthanl0l
5
@ lessthanl0l: stackoverflow.com/q/872565/827263 #
Keith Thompson
relacionada help.github.com/articles/...
Trevor Boyd Smith

Respostas:

3224

Use git rm.

Se você deseja remover o arquivo do repositório Git e do sistema de arquivos , use:

git rm file1.txt
git commit -m "remove file1.txt"

Mas se você deseja remover o arquivo apenas do repositório Git e não do sistema de arquivos, use:

git rm --cached file1.txt
git commit -m "remove file1.txt"

E para enviar alterações para repo remoto

git push origin branch_name  
Greg Hewgill
fonte
93
Também é útil: git rm -r directory // Para remover o diretório e o conteúdo
Reg
10
Isso não vai se livrar desse arquivo em outros commits.
Vato
6
@SaulOrtega: Está correto. Para remover um arquivo de confirmações anteriores (alterando o histórico anterior), consulte a página de ajuda do GitHub em Remover dados confidenciais .
Greg Hewgill
15
Observe que isso também excluirá o arquivo localmente. Se você quiser excluí-lo apenas do repositório, faça: git rm --cached file1.txt
Weston Ganger
5
Vale a pena notar que, se esse arquivo contiver informações confidenciais (por exemplo, credenciais), você deverá alterá-las imediatamente . Para citar o GitHub "Depois de enviar um commit ao GitHub, você deve considerar comprometidos os dados que ele contém. Se você confirmou uma senha, altere-a! Se você enviou uma chave, gere uma nova."
C1moore 14/09/16
608

git rm file.txtremove 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 no 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, criei um diretório privado e desvinculado e enviei os arquivos para ele buscar no navegador. Esquecendo que fiz isso, mais tarde fiz um a git add -Apartir do diretório base do site. Posteriormente, git statusmostrou os novos arquivos que precisam ser confirmados. Agora eu precisava excluí-los do controle de versão e rastreamento do git ...

A amostra de saída abaixo é do que aconteceu comigo, onde eu excluí o .003arquivo acidentalmente . Felizmente, não me importo com o que aconteceu com a cópia local .003, mas alguns dos outros arquivos alterados atualmente são atualizações que acabei de fazer no site e seria épico ter sido excluído no sistema de arquivos local! "Sistema de arquivos local" = o site ativo (não é uma boa prática, mas é 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: Essa resposta é obter algum tráfego, então eu pensei que eu ia mencionar minhas outras respostas Git ações um par de grandes recursos: Esta página possui um gráfico que ajuda a desmistificar o Git para mim. O livro "Pro Git" está online e me ajuda muito.

Chris K
fonte
6
Você precisaria confirmar isso com algo parecido git commit -m "Just removing file1.txt"e, se você tiver um repositório remoto, envie o commit com algo parecido git push origin master.
ban-geoengineering
77

Primeiro, se você estiver usando git rm, especialmente para vários arquivos, considere que qualquer curinga será resolvido pelo shell, não pelo gitcomando.

git rm -- *.anExtension
git commit -m "remove multiple files"

Mas, se o seu arquivo já estiver no GitHub, você pode (desde julho de 2013) excluí-lo diretamente da GUI da web!

Basta visualizar qualquer arquivo no seu repositório, clicar no ícone da lixeira na parte superior e confirmar a remoção como qualquer outra edição baseada na Web.

Então " git pull" no seu repositório local, e isso excluirá o arquivo localmente também.
O que torna essa resposta uma maneira (indireta) de excluir um arquivo do git repo?
(Sem mencionar que um arquivo no GitHub está em um "repositório git")


botão excluir

(a confirmação refletirá a exclusão desse arquivo):

cometer uma exclusão

E assim, se foi.

Para obter ajuda com esses recursos, leia nossos artigos de ajuda sobre como criar , mover , renomear e excluir arquivos.

Nota: Por ser um sistema de controle de versão, o Git sempre estará disponível se você precisar recuperar o arquivo posteriormente.

A última frase significa que o arquivo excluído ainda faz parte do histórico e você pode restaurá-lo com bastante facilidade (mas ainda não através da interface da web do GitHub):

Consulte " Restaurar um arquivo excluído em um repositório Git ".

VonC
fonte
4
Você precisa rolar para baixo e clicar em "Confirmar alterações" para confirmar a exclusão!
LevinsonTechnologies
1
Isso não funciona para arquivos de texto grandes. O servidor tenta renderizar o arquivo como na captura de tela e falha com um erro 500.
precisa saber é o seguinte
9
Esta resposta se refere ao github, a pergunta é sobre um repositório git. Não é como usar a interface do github.
Peter Marshall
65

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 ou tipo de arquivo. Tenha muito cuidado, pois isso passará por todas as confirmações e eliminará esse tipo de arquivo.

EDIT: preste atenção - após este comando, você não poderá empurrar ou puxar - você verá a rejeição da 'história não relacionada', você pode usar 'git push --force -u origin master' para empurrar ou puxar

Jason Glisson
fonte
9
Essa é uma ótima resposta, mas observe que, ao contrário das outras respostas, este comando reescreve o histórico de confirmação e remove todo o rastreamento dos arquivos correspondentes ao padrão. Isso é particularmente útil se você descobrir acidentalmente algumas informações confidenciais (e, se necessário, puder usar com êxito --force para reescrever o histórico de quaisquer repostos remotos para os quais foi enviado).
precisa saber é o seguinte
3
Esse foi exatamente o problema que tive e foram necessárias algumas tentativas e erros para acertar. Um cara com quem eu estava trabalhando havia comprometido vários grandes despejos de banco de dados em um repositório que remonta a muitos muitos commits. É por isso que usei .sql no meu exemplo. Meu repositório ficou tão grande e inchado que o github não aceitaria mais empurrões.
Jason Glisson
3
Se você estiver usando um mestre remoto, você precisa forçar uma consolidação e empurrá-lo para cima comgit push --force -u origin master
AlbertMarkovski
2
@AlbertMarkovski Desculpe, não fui específico. Na verdade, o Github não aceitaria o envio porque o repositório estava além do limite de tamanho. Pelo menos vários GBs. Eles me cortaram e me mandaram um email sobre isso. Portanto, infelizmente, nenhuma quantidade de forçar um empurrão ajudaria nesse ponto.
Jason Glisson
2
@ JasonGlisson Eu também enfrentei esse problema em que um vídeo foi adicionado a um repositório por acidente.
AlbertMarkovski
34

Além disso, se for uma pasta a ser removida e as pastas ou arquivos filhos subsequentes, use:

git rm -r foldername
Rajá
fonte
2
Isso remove a pasta do local também! Use git rm --cached -r <foldername>
Axis
24

De maneira mais geral, git helpajudará 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
James Polley
fonte
6
Para coisas mais complexas, acho git helpconfuso, mas bom é para as coisas simples :)
James Polley
9
Na verdade, não é tão bom para o git noobs porque "index" não é um conceito que o git noobs esteja familiarizado. Falo por experiência pessoal de ser um git noob :) Além disso, acho muito menos confuso dizer que rm encena um arquivo para exclusão em vez de removê-lo do índice (embora ainda não faça sentido para noobs).
Roman Starkov
Concordando com romkyns: A descrição "Remover arquivos da árvore de trabalho e do índice" não me parece uma maneira de remover o arquivo do repositório. Talvez se eu entendesse melhor o git, entenderia. Em vez disso, parece que você está apenas arquivos unstaging (e opcionalmente removendo-os da árvore de trabalho - isso afetaria necessariamente o repo?)
Larsh
14

Se você deseja excluir o arquivo do repositório, mas deixe-o no sistema de arquivos (não será rastreado):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Se você deseja excluir o arquivo do repositório e do sistema de arquivos, há duas opções:

  1. Se o arquivo não tiver alterações testadas no índice:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Se o arquivo tiver alterações testadas no índice:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

fonte
12

git rm somente removerá o arquivo neste ramo a partir de agora, mas ele permanecerá no histórico e o git se lembrará dele.

A maneira certa de fazer isso é com git filter-branch, como outros já mencionaram aqui. Ele reescreverá todas as confirmações no histórico da ramificação para excluir esse arquivo.

Mas, mesmo depois de fazer isso, o git pode se lembrar disso, pois pode haver referências a ele no reflog, controles remotos, tags e outras coisas.

Se você deseja eliminá-lo completamente em uma etapa, eu recomendo que você use git forget-blob

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

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

Isso remove todas as referências, faz git filter-branche, finalmente, executa o coletor de lixo git git gcpara se livrar completamente desse arquivo em seu repositório.

nachoparker
fonte
10

Outra maneira, se você deseja excluir o arquivo da pasta local usando o comando rm e, em seguida, envie as alterações para o servidor remoto.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master
Suhaib
fonte
10

Nota: se você deseja excluir o arquivo apenas do git, use abaixo:

git rm --cached file1.txt

Se você deseja excluir também do disco rígido:

git rm file1.txt

Se você deseja remover uma pasta (a pasta pode conter poucos arquivos), remova usando o comando recursivo, como abaixo:

git rm -r foldername

Se você deseja remover uma pasta dentro de outra pasta

git rm -r parentFolder/childFolder

Então, você pode commite pushcomo de costume. No entanto, se você quiser recuperar a pasta excluída, siga este procedimento: é possível recuperar arquivos excluídos do git.

Do documento:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

OPÇÕES

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

pode ser necessário evitá-los. Um nome de diretório principal (por exemplo, dir para remover o diretório / arquivo1 e o diretório / arquivo2) pode ser fornecido para remover todos os arquivos do diretório e todos os subdiretórios recursivamente, mas isso requer que a opção -r seja explicitamente fornecida. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

opções de linha de comando). --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Leia mais sobre o documento oficial.

Blasanka
fonte
7

Para excluir um arquivo específico

nome do arquivo git rm

Para limpar todos os arquivos não rastreados de um diretório de forma recursiva em captura única

git clean -fdx

Sitesh
fonte
5

Se você possui o aplicativo GitHub for Windows, pode excluir um arquivo em 5 etapas fáceis:

  • Clique em Sincronizar.
  • Clique no diretório em que o arquivo está localizado e selecione sua versão mais recente.
  • Clique nas ferramentas e selecione "Abrir um shell aqui".
  • No shell, digite: "rm {filename}" e pressione enter.
  • Confirme a alteração e ressincronize.
jushusted
fonte
5

No meu caso, tentei remover o arquivo no github depois de alguns commits, mas salvar 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

OlegV
fonte
3
  1. Primeiro, remova os arquivos do repositório local.

    git rm -r Nome do arquivo

    ou remova arquivos apenas do repositório local, mas do sistema de arquivos

    git rm --cached Nome do arquivo

  2. Em segundo lugar, confirmar as alterações no repositório local.

    git commit -m "unwanted files or some inline comments"   
    
  3. Por fim, atualize / envie as alterações locais para o repositório remoto.

    git push 
    
Ajay Kumar
fonte
isso removeria tudo relacionado ao arquivo adicionado e enviado acidentalmente?
bapors
1

Tentei muitas das opções sugeridas e nenhuma parecia funcionar (não listarei os vários problemas). O que acabei fazendo, que funcionou, foi simples e intuitivo (para mim) foi:

  1. mover todo o repositório local para outro lugar
  2. clone novamente o repositório do master para a unidade local
  3. copie de volta os arquivos / pastas da sua cópia original no 1 para o novo clone do 2
  4. verifique se o arquivo grande com problema não existe ou está excluído no arquivo .gitignore
  5. faça o git usual add / git commit / git push
Jacanterbury
fonte
1

Depois de remover o arquivo do repositório, git rmvocê pode usar o BFG Repo-Cleaner para obliterar completa e facilmente o arquivo do histórico do repositório.

glisu
fonte
0

Tenho arquivos obj e bin que acidentalmente entraram no repositório que não quero poluir minha lista de 'arquivos alterados'

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

/*/obj
/*/bin

O problema é que eles já estão no controle remoto e, quando são alterados, 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 de recompra (ou seja, C:\repos\MyRepo )
  2. Eu quero excluir SSIS \ obj. Parece que você só pode excluir no nível superior; portanto, agora você precisa fazer o CD no SSIS: (ou seja,C:\repos\MyRepo\SSIS )
  3. Agora digite o encantamento mágico git rm -r -f obj
    • rm = remover
    • -r = remover recursivamente
    • -f = significa força, porque você realmente quer dizer isso
    • obj é a pasta
  4. Agora corra git commit -m "remove obj folder"

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

Então, como não queria procurar a linha CMD, entrei no Visual Sstudio e fiz uma sincronização para aplicá-la ao controle remoto.

Nick.McDermaid
fonte
0

Se você precisar remover arquivos de uma extensão determinada (por exemplo, arquivos compilados), faça o seguinte para removê-los todos de uma vez:

git remove -f *.pyc
Sergi Ramón
fonte
0

De acordo com a documentação .

git rm --cached giant_file

Quando se trata de dados confidenciais - é melhor não dizer que você removeu o arquivo, mas apenas incluí-lo no último commit conhecido:

0. Alterar última confirmação

git commit --amend -CHEAD

Se você deseja excluir o arquivo de todo o histórico do git, de acordo com a documentação , faça o seguinte:

1. Remova-o do seu histórico local

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Não se esqueça de incluir este arquivo em .gitignore (se for um arquivo que você nunca deseja compartilhar (como senhas ...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Se você precisar remover do controle remoto

git push origin --force --all

4. Se você também precisar removê-lo das liberações de tags:

git push origin --force --tags
Tomas Baran
fonte
-7

No caso de você não arquivar no repositório local, mas no git repo, basta abrir o arquivo no git repo através da interface da web e encontrar o botão Excluir no canto direito da interface. Clique aqui, para exibir a interface Excluir opção

Poseidon
fonte