Visão geral do Git rm

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.

-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 .

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.