Nesta seção, o objetivo é falar sobre o comando git clean a fundo. O git clean é, até certo ponto, um comando de "desfazer". O Git clean pode ser considerado complementar a outros comandos como o git reset e o git checkout. Enquanto esses outros comandos funcionam em arquivos já adicionados ao índice de monitoramento do Git, o comando git clean funciona em arquivos não monitorados. Arquivos não monitorados são arquivos que foram criados no diretório de trabalho do repositório, mas ainda não foram adicionados ao índice de monitoramento do repositório com o uso do comando git add. Para demonstrar melhor a diferença entre arquivos monitorados e não monitorados, veja o seguinte exemplo de linha de comando:

 $ mkdir git_clean_test $ cd git_clean_test/ $ git init . Repositório do Git vazio inicializado em /Users/kev/code/git_clean_test/.git/ $ echo "monitorado" > ./tracked_file $ git add ./tracked_file $ echo "não monitorado" > ./untracked_file $ mkdir ./untracked_dir && touch ./untracked_dir/file $ git status Na ramificação mestre Commit inicial Alterações a receberem commit: (usar "git rm --cached ..." para despreparar) novo arquivo: tracked_file Arquivos não monitorados: (usar "git add ..." para incluir o que vai receber commit) untracked_dir/ untracked_file

O exemplo cria um novo repositório do Git no diretório do git_clean_test. Depois, cria um tracked_file que é adicionado ao índice do Git; além disso, um untracked_file é criado, assim como um untracked_dir. Então, o exemplo invoca o git status, que exibe resultados indicando a condição interna do Git de alterações monitoradas e não monitoradas. Com o repositório nesse modo, é possível executar o comando git clean para demonstrar o objetivo.

 $ git clean fatal: clean.requireForce muda para verdadeiro e nem -i, -n, nem -f transmitidos; recusa para limpar

Nesse ponto, executar o comando git clean padrão pode ser um erro fatal. O exemplo acima demonstra o que isso pode representar. Por padrão, o Git é configurado em caráter global para exigir que o git clean receba uma opção de "force" para inicializar. É um mecanismo de segurança importante. Quando enfim executado, o git clean não pode ser revertido. Quando executado por completo, o git clean vai realizar a exclusão completa do sistema de arquivos, como se executasse o utilitário rm da linha de comando. Verifique se quer mesmo excluir os arquivos não monitorados antes de executar.

Opções e uso comuns

Levando em consideração a explicação anterior dos comportamentos do git clean e das advertências relacionadas a ele, o conteúdo a seguir apresenta diversos casos de uso do git clean e as opções de linha de comando associadas e necessárias para a execução.

-n

A opção -n vai executar o processo de “dry run” do git clean. Isso vai exibir os arquivos a serem excluídos sem de fato os excluir. É recomendável sempre executar o dry run do git clean primeiro. É possível visualizar essa opção no repositório de demonstração criado antes.

 $ git clean -n Excluiria untracked_file

O resultado mostra que o untracked_file vai ser excluído quando o comando git clean for executado. Veja que o untracked_dir não foi relatado nos resultados aqui. Por padrão, o funcionamento do git clean não é recorrente em diretórios. Esse é outro mecanismo de segurança para evitar uma exclusão acidental e permanente.

 -f ou --force

A opção force dá início de fato à exclusão de arquivos não monitorados do diretório atual. Ela é necessária a menos que a opção de configuração clean.requireForce esteja marcada como falsa. Ela não vai remover pastas ou arquivos não monitorados especificados pelo .gitignore. A gente vai agora executar o git clean ao vivo no repositório para exemplificação.

 $ git clean -f Remoção de untracked_file

O comando vai mostrar os arquivos que são excluídos. Aqui, é possível ver que o untracked_file foi excluído. Executar o git status nesse ponto ou realizar ls vai mostrar que o untracked_file foi excluído e não pode ser encontrado. Por padrão, o git clean -f vai funcionar em todos os arquivos não monitorados do diretório atual. Ainda, um valor pode ser transmitido com a opção -f, que vai remover um arquivo específico.

 git clean -f  -d incluir diretórios

A opção -d informa ao git clean que você também quer excluir quaisquer diretórios não monitorados; por padrão, ele vai ignorar os diretórios. É possível adicionar a opção -d aos exemplos anteriores:

 $ git clean -dn Excluiria untracked_dir/ $ git clean -df Remoção de untracked_dir/

Aqui, o "dry run" foi executado com a combinação -dn, que mostra que o untracked_dir pode ser excluído. Depois, a gente executa uma limpeza forçada, e é possível ver que o untracked_dir foi excluído.

 Remoção -x force de arquivos ignorados

Uma tendência em versões de software é a existência de um diretório de build ou distribuição que não é submetido ao índice de monitoramento dos repositórios. O diretório de build vai abranger artefatos de build efêmeros gerados do código-fonte objeto de commit. Esse diretório de build é adicionado com frequência ao arquivo .gitignore dos repositórios. Também pode ser conveniente limpar esse diretório com outros arquivos não monitorados. A opção -x diz ao git clean para incluir também quaisquer arquivos ignorados. Assim como em invocações anteriores do git clean, é recomendável executar "dry run" primeiro, antes da exclusão final. A opção -x vai atuar em todos os arquivos ignorados, não apenas nos específicos de build de projeto. Esse procedimento pode ter efeito em algum elemento indesejado, como arquivos de configuração de IDE ./.idea.

 git clean -xf 

Assim como a opção -d, a -x pode ser transmitida e elaborada com outras opções. Esse exemplo demonstra uma combinação com a opção -f, que vai remover arquivos não monitorados do diretório atual assim como quaisquer arquivos que o Git ignora com frequência.

Modo interativo ou git clean interativo

Além da execução ad hoc das linhas de comando demonstradas até agora, o git clean tem um modo "interativo" que pode ser inicializado pela transmissão da opção -i. A gente vai revisitar o repositório para exemplificação da introdução deste documento. Naquele modo inicial, vamos realizar uma sessão interativa de limpeza.

 $ git clean -di Excluiria os seguintes elementos: untracked_dir/ untracked_file *** Comandos *** 1: limpar 2: filtrar por padrão 3: selecionar por números 4: perguntar para cada 5: sair 6: ajuda What now>

Iniciamos a sessão interativa com a opção -d para que ela também atue na untracked_dir. O modo interativo vai exibir o prompt What now> ("o que fazer agora"), que pede um comando a ser utilizado com arquivos não monitorados. Os comandos em si são bastante autoexplicativos. A gente vai fazer uma análise objetiva de cada um em ordem aleatória, começando pelo comando 6: ajuda. A seleção do comando 6 vai explicar melhor os outros:

 What now> 6 limpar - começar limpeza filtrar por padrão - excluir elementos da limpeza selecionar por números - selecionar elementos a serem excluídos por números perguntar para cada - confirmar cada exclusão (como "rm -i") sair - interromper limpeza ajuda - esta tela ? - ajuda para seleção de prompt
 5: sair

Bem intuitivo: vai fechar a sessão interativa.

 1: limpar

Vai excluir os elementos indicados. Se o comando 1: limpar fosse executado nesse ponto, untracked_dir/ untracked_file seriam excluídos.

 4: perguntar para cada

vai repetir para cada arquivo não monitorado e exibir um prompt S/N para uma exclusão. Seria assim:

 *** Comandos *** 1: limpar 2: filtrar por padrão 3: selecionar por números 4: perguntar para cada 5: sair 6: ajuda What now> 4 Remover untracked_dir/ [s/N]? N Remover untracked_file [s/N]? N
 2: filtrar por padrão

Vai exibir um prompt adicional que considera a entrada usada para filtrar a lista de arquivos não monitorados.

 Excluiria os seguintes elementos: untracked_dir/ untracked_file *** Comandos *** 1: limpar 2: filtrar por padrão 3: selecionar por números 4: perguntar para cada 5: sair 6: ajuda What now> 2 untracked_dir/ untracked_file Entrada ignorar padrões>> *_file untracked_dir/

Aqui, inserimos o padrão de asterisco *_file, que então restringe a lista de arquivos não monitorados a apenas untracked_dir.

 3: selecionar por números

Parecido com o comando 2, o 3 serve para refinar a lista de nomes de arquivos não monitorados. A seção interativa vai pedir por números que correspondam ao nome de um arquivo não monitorado.

 Excluiria os seguintes elementos: untracked_dir/ untracked_file *** Comandos *** 1: limpar 2: filtrar por padrão 3: selecionar por números 4: perguntar para cada 5: sair 6: ajuda What now> 3 1: untracked_dir/ 2: untracked_file Selecionar elementos a serem excluídos>> 2 1: untracked_dir/ * 2: untracked_file Selecionar elementos a serem excluídos>> Excluiria o seguinte elemento: untracked_file *** Comandos *** 1: limpar 2: filtrar por padrão 3: selecionar por números 4: perguntar para cada 5: sair 6: ajuda

Resumo

Em síntese, o git clean é um método conveniente para a exclusão de arquivos não monitorados em um diretório de trabalho do repositório. Arquivos não monitorados são aqueles que estão no diretório do repositório mas ainda não foram adicionados ao índice com o git add. Em geral, os resultados do git clean podem ser alcançados com o uso do git status e as ferramentas de exclusão nativas dos sistemas operacionais. O git clean pode ser usado junto com o git reset para desfazer por completo quaisquer adições e commits em um repositório.