Close

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
Logotipo do Git
Material relacionado

Folha de consulta do Git

Logotipo do Bitbucket
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 versão 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 file. 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. Isso pode 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.

Pessoas colaborando usando uma parede cheia de ferramentas

Blog do Bitbucket

Ilustração do DevOps

Caminho de aprendizagem de DevOps

Demonstrações de funções no Demo Den com parceiros da Atlassian

Como o Bitbucket Cloud funciona com o Atlassian Open DevOps

Inscreva-se para receber a newsletter de DevOps

Thank you for signing up