git rm
Uma pergunta comum que muitas pessoas fazem ao começar a usar o Git é "Como dizer ao Git para não rastrear mais um arquivo (ou arquivos)?" O comando git rm
é usado para remover arquivos de um repositório do Git. Ele pode ser considerado como o inverso do comando git add.
Visão geral do Git rm
O comando git rm
pode ser usado para remover arquivos individuais ou uma coleção de arquivos. A principal função do git rm
é remover arquivos rastreados do índice de Git. O git rm
também pode ser usado para remover arquivos do índice de staging e do diretório de trabalho. Não existe opção de remover um arquivo de apenas um diretório de trabalho. Os arquivos sendo operadores devem ser idênticos aos arquivos no HEAD
atual. Se houver uma diferença entre a versão do HEAD
de um arquivo e a versão do índice de staging ou da árvore de trabalho, o Git vai bloquear a remoção. O bloqueio é um mecanismo de segurança para evitar a remoção de mudanças em progresso.
Observe que o git rm
não remove as ramificações. Saiba mais sobre o uso de ramificações do git
Uso
<file>…
Especifica os arquivos a serem removidos. O valor da opção pode ser um arquivo individual, uma lista de arquivos delimitada por espaços, file1 file2 file3
, ou um glob de arquivo curinga (~./directory/*)
.
-f
--force
A opção -f
é usada para substituir a verificação de segurança que o Git faz para garantir que os arquivos no HEAD
correspondam ao conteúdo atual no índice de staging e no diretório de trabalho.
Material relacionado
Folha de consulta do Git
VER SOLUÇÃO
Aprenda a usar o Git com o Bitbucket Cloud
-n
--dry-run
A opção "dry run" é uma proteção que vai executar o comando git rm
, porém não vai excluir de fato os arquivos. Ela vai exibir quais arquivos ela teria removido.
-r
A opção -r
é uma abreviação para "recursive". Ao operar no modo recursivo, o git rm
vai remover o diretório alvo e todos os conteúdos dele.
--
A opção de separador é usada para fazer a distinção explícita entre uma lista de nomes de arquivos e os argumentos sendo transmitidos ao git rm
. Ela é útil se algum dos nomes de arquivo tiver uma sintaxe que possa ser confundida com outras opções.
--cached
A opção em cache especifica que a remoção deveria ocorrer apenas no índice de staging. Os arquivos do diretório de trabalho vão permanecer iguais.
--ignore-unmatch
Assim, o comando fecha com o status sigterm 0, mesmo se nenhum arquivo corresponder. Este é um código de status de nível Unix. O código 0 indica uma invocação bem-sucedida do comando. A opção --ignore-unmatch
pode ser útil ao usar git rm
como parte de um script de shell maior que precisa ter função de falha controlada.
-q
--quiet
A opção silenciosa oculta o resultado do comando git rm
. O comando costuma resultar em uma linha para cada arquivo removido.
Como desfazer o git rm
A execução de git rm
não é uma atualização permanente. O comando vai atualizar o índice de staging e o diretório de trabalho. Essas mudanças não vão persistir até que um novo commit seja criado e as mudanças sejam adicionadas ao histórico de commits. Ou seja: as mudanças aqui podem ser "desfeitas" usando comandos comuns de Git.
git reset HEAD
A redefinição vai reverter o índice de staging atual e o diretório de trabalho de volta ao commit de HEAD
. Assim, vai desfazer um git rm
.
git checkout .
Um checkout vai ter o mesmo efeito e vai restaurar a versão mais recente de um arquivo do HEAD
.
Caso o git rm
tenha sido executado e um novo commit criado e persistente à remoção, o git reflog
pode ser usado para encontrar uma referência anterior à execução de git rm
. Saiba mais sobre o uso de git reflog.
Discussão
O argumento <file>
indicado para o comando pode ser de caminhos exatos, padrões de glob de arquivo curinga ou nomes exatos de diretórios. O comando remove apenas os caminhos com commit no momento no repositório do Git.
O globbing de arquivos curinga corresponde entre os diretórios. É importante ter cuidado ao usar globs curingas. Considere os exemplos: directory/*
e directory*
. O primeiro exemplo vai remover todos os subarquivos de directory/
, enquanto o segundo exemplo vai remover todos os diretórios irmãos, como directory1
directory2
directory_whatever
, que pode ser um resultado inesperado.
O escopo do Git rm
O comando git rm
opera apenas na ramificação atual. O evento de remoção é aplicado apenas às árvores do diretório de trabalho e do índice de staging. A remoção de arquivos não é persistente no histórico do repositório até que um novo commit seja criado.
Por que usar git rm em vez de rm
Um repositório do Git vai reconhecer quando um comando rm
de shell regular for executado em um arquivo que está rastreando. Ele vai atualizar o diretório de trabalho para refletir a remoção. Ele não vai atualizar o índice de staging com a remoção. Outro comando git add
vai precisar ser executado nos caminhos dos arquivos removidos para adicionar as mudanças ao índice de staging. O comando git rm
age como um atalho uma vez que vai atualizar o diretório de trabalho e o índice de staging com a remoção.
Exemplos
git rm Documentation/\*.txt
Este exemplo usa um glob de arquivo curinga para remover todos os arquivos *.txt
filhos do diretório da Documentação
e quaisquer subdiretórios.
Observe que o asterisco * é escapado com barras neste exemplo; esta é uma proteção que evita que o shell expanda o curinga. O curinga, então, expande os nomes de caminho dos arquivos e subdiretórios sob o diretório Documentation/
.
git rm -f git-*.sh
Este exemplo usa a opção force e é direcionada a todos os arquivos git-*.sh
curingas. A opção force remove os arquivos de destino do diretório de trabalho e do índice de staging.
Como remover arquivos que não estão mais no sistema de arquivos
Conforme dito acima em "Por que usar git rm
em vez de rm
", o git rm
é, na verdade, um comando simples que combina o shell rm
padrão e o git add
para remover um arquivo do diretório de trabalho e promover a remoção para o índice de staging. Um repositório pode ficar em um estado complicado caso diversos arquivos tenham sido removidos usando apenas o comando shell rm
padrão.
Se a intenção é gravar todos os arquivos com remoção explícita como parte do próximo commit, o git commit -a
vai adicionar todos os eventos de remoção ao índice de staging em preparação para o próximo commit.
No entanto, se a intenção for fazer a remoção persistente dos arquivos que foram removidos com o shell rm
, use o comando a seguir:
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Este comando vai gerar uma lista dos arquivos removidos do diretório de trabalho e encaminhar esta lista por pipe para git rm --cached
, que vai atualizar o índice de staging.
Resumo do Git rm
git rm
é um comando que opera em duas das árvores de gerenciamento de estado interno do Git primário: o diretório de trabalho e o índice de staging. O git rm
é usado para remover um arquivo de um repositório do git. É um método simples que combina o efeito do comando shell rm
padrão com git add
. Ou seja: ele primeiro vai remover um alvo do sistema de arquivos e depois vai adicionar o evento de remoção ao índice de staging. O comando é um dos muitos que podem ser usados para desfazer mudanças no Git.
Compartilhar este artigo
Próximo tópico
Leitura recomendada
Marque esses recursos para aprender sobre os tipos de equipes de DevOps ou para obter atualizações contínuas sobre DevOps na Atlassian.