Git Clean
Nesta seção, a gente vai explicar a fundo o comando git clean
. Git clean
é, até certo ponto, um comando de “desfazer”. O Git clean
pode ser considerado complementar a outros comandos como git reset e git checkout. Enquanto esses outros comandos operam em arquivos já adicionados ao índice de rastreamento do Git, o comando git clean
opera em arquivos não rastreados. Arquivos não rastreados são arquivos que foram criados dentro do diretório de trabalho do repositório, mas ainda não foram adicionados ao índice de rastreamento do repositório usando o comando git add.
Para demonstrar melhor a diferença entre arquivos rastreados e não rastreados, considere o seguinte exemplo de linha de comando
$ mkdir git_clean_test
$ cd git_clean_test/
$ git init .
Initialized empty Git repository in /Users/kev/code/git_clean_test/.git/
$ echo "tracked" > ./tracked_file
$ git add ./tracked_file
$ echo "untracked" > ./untracked_file
$ mkdir ./untracked_dir && touch ./untracked_dir/file
$ git status
On branch master
Initial commit
Changes to be committed: (use "git rm --cached <file>..." to unstage)
new file: tracked_file
Untracked files: (use "git add <file>..." to include in what will be committed) untracked_dir/ untracked_file
Material relacionado
Folha de consulta do Git
VER SOLUÇÃO
Aprenda a usar o Git com o Bitbucket Cloud
O exemplo cria um novo repositório do Git no diretóriogit_clean_test
. Em seguida, ele prossegue para criar um tracked_file
que é adicionado ao índice Git, além disso, um untracked_file
é criado, assim como um untracked_dir
. O exemplo então invoca o git status
que exibe a saída indicando o estado interno do Git de alterações rastreadas e não rastreadas. Com o repositório neste estado, a gente pode executar o comando git clean
para demonstrar o propósito pretendido.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
Neste ponto, executar o comando padrão git clean
pode produzir um erro fatal. O exemplo acima demonstra como isso pode parecer. Por padrão, o Git é configurado globalmente para exigir que o git clean
seja passado por uma opção de "força" para iniciar. Este é um mecanismo de segurança importante. Depois de executado, o git clean
não pode ser desfeito. Quando executado por completo, o git clean
vai fazer uma exclusão irreversível do sistema de arquivos, semelhante à execução do utilitário rm da linha de comando. Considere se você quer mesmo excluir os arquivos não rastreados antes de executar o comando.
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 um “dry run” do git clean. Tal execução vai mostrar quais arquivos vão ser removidos sem que a remoção de fato ocorra. É uma prática recomendada para sempre primeiro executar uma dry run de git clean. A gente pode demonstrar essa opção no repositório de demonstração que foi criado antes.
$ git clean -n
Would remove untracked_file
A saída nos diz que untracked_file
vai ser removido quando o comando git clean
for executado. Observe que o untracked_dir
não é relatado na saída aqui. Por padrão, o git clean
não vai funcionar recursivamente em diretórios. Este é outro mecanismo de segurança para evitar exclusões permanentes acidentais.
-f or --force
A opção force inicia a exclusão real de arquivos não rastreados do diretório atual. Ela é necessária a menos que a opção de configuração clean.requireForce
esteja definida como falsa. Essa opção não vai remover pastas ou arquivos não rastreados especificados por .gitignore
. Agora a gente vai executar um git clean
ao vivo em nosso exemplo de repositório.
$ git clean -f
Removing untracked_file
O comando vai emitir os arquivos que são removidos. Você pode ver aqui que o untracked_file
foi removido. Executar o status git neste momento ou fazer um ls vai mostrar que untracked_file foi excluído e não está em lugar nenhum. Por padrão git clean -f vai operar em todos os arquivos não rastreados do diretório atual. Além disso, um valor de < path > pode ser passado com a opção -f que vai remover um arquivo específico.
git clean -f <path>
-d include directories
A opção -d diz ao git clean que você também deseja remover quaisquer diretórios não rastreados, por padrão, ele vai ignorar diretórios. A gente pode adicionar a opção -d aos nossos exemplos anteriores:
$ git clean -dn
Would remove untracked_dir/
$ git clean -df
Removing untracked_dir/
Aqui a gente executou um 'dry run' usando a combinação -dn que tem saídas untracked_dir prontas para remoção. Em seguida, a gente executou uma limpeza forçada e recebeu informação de que o untracked_dir foi removido.
-x force removal of ignored files
Um padrão de lançamento de software comum é ter um diretório de distribuição ou build que não esteja confirmado com o índice de rastreamento de repositórios. O diretório de build vai conter artefatos de build efêmeros que são gerados a partir do código-fonte confirmado. Este diretório de build costuma ser adicionado aos repositórios .gitignore . Pode ser conveniente também limpar este diretório com outros arquivos não rastreados. A opção -x diz ao git clean para incluir também quaisquer arquivos ignorados. Tal como acontece com as invocações anteriores do git clean, é uma prática recomendada para executar um "dry run" primeiro, antes da exclusão final. A opção -x vai atuar em todos os arquivos ignorados, não apenas em específicos do build do projeto, podendo ser coisas não intencionais, como arquivos de configuração IDE ./.idea.
git clean -xf
Como a opção -d -x pode ser passada e composta com outras opções. Este exemplo demonstra uma combinação com -f que vai remover arquivos não rastreados do diretório atual, bem como quaisquer arquivos que o Git costuma ignorar.
Modo interativo ou git clean interativo
Além da execução ad hoc da linha de comandos que a gente demonstrou até agora, o git clean
tem um modo "interativo" que você pode iniciar transferindo a opção -i
. Vamos revisar o repositório de exemplo da introdução deste documento. Naquele estado inicial, vamos iniciar uma sessão interativa limpa.
$ git clean -di
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now>
A gente iniciou a sessão interativa com a opção -d
para que ela também atuasse no untracked_dir
. O modo interativo vai exibir um>prompt O que agora
solicita um comando para aplicar aos arquivos não rastreados. Os comandos em si são bastante autoexplicativos. A gente vai dar uma breve olhada em cada um e em uma ordem aleatória, começando com o comando 6: help
. Selecionar o comando 6 vai explicar ainda mais os outros comandos:
What now> 6
clean - start cleaning
filter by pattern - exclude items from deletion
select by numbers - select items to be deleted by numbers
ask each - confirm each deletion (like "rm -i")
quit - stop cleaning
help - this screen
? - help for prompt selection
5: quit
É direto e vai encerrar a sessão interativa.
1: clean
Vai apagar os itens indicados. Se a gente executasse o 1: clean
neste ponto, o untracked_dir/ untracked_file
seria removido
4: ask each
Vai iterar em cada arquivo não rastreado e exibir um prompt Y/N
para uma exclusão. Parece o seguinte:
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 4
Remove untracked_dir/ [y/N]? N
Remove untracked_file [y/N]? N
2: filter by pattern
Vai exibir um prompt adicional que recebe entrada usada para filtrar a lista de arquivos não rastreados.
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 2
untracked_dir/ untracked_file
Input ignore patterns>> *_file
untracked_dir/
Aqui a gente inseriu o padrão curinga *_file
que então restringe a lista de arquivos não rastreados para apenas untracked_dir
.
3: select by numbers
Semelhante ao comando 2, o comando 3 trabalha para refinar a lista de nomes de arquivos não rastreados. A sessão interativa vai solicitar números que correspondem a um nome de arquivo não rastreado.
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 3
1: untracked_dir/ 2: untracked_file
Select items to delete>> 2
1: untracked_dir/ * 2: untracked_file
Select items to delete>>
Would remove the following item:
untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
Resumo
Em síntese, git clean
é um método conveniente para excluir 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 git add. Em geral, os resultados de git clean
podem ser alcançados com o uso de git status e as ferramentas de exclusão nativas dos sistemas operacionais. É possível usar git clean
junto com git reset para desfazer por completo as adições e commits em um repositório.
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.