Nesta seção, vamos focar em uma discussão detalhada do comando git clean
. Git clean
é até certo ponto um comando ‘undo’. Git clean
pode ser considerado complementar a outros comandos como git reset
e git checkout
. Enquanto esses outros comandos operam em arquivos previamente adicionados ao índice de rastreamento Git, o comando git clean
opera em arquivos não rastreados. Arquivos desempilhados são arquivos que foram criados dentro do diretório de trabalho do seu repo, mas ainda não foram adicionados ao índice de rastreamento do repositório usando o comando git add
. Para melhor demonstrar 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 ..." to unstage) new file: tracked_file Untracked files: (use "git add ..." to include in what will be committed) untracked_dir/ untracked_file
O exemplo cria um novo repositório Git no diretório git_clean_test
. Ele então procede para criar um tracked_file
que é adicionado ao índice de Git, adicionalmente, um untracked_file
é criado, e um untracked_dir
. O exemplo então invoca git status
que exibe a saída indicando o estado interno das mudanças rastreadas e não rastreadas de Git. Com o repositório neste estado, podemos executar o comando git clean
para demonstrar seu propósito.
$ 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 o que isto pode parecer. Por padrão, Git é configurado globalmente para requerer que git clean
seja passada uma opção “force” para iniciar. Este é um importante mecanismo de segurança. Quando finalmente executado, git clean
não é impossível. Quando totalmente executado, git clean
fará uma exclusão do sistema de arquivos rígido, similar à execução do utilitário rm de linha de comando. Certifique-se que quer realmente apagar os ficheiros não verificados antes de o executar.
Opções comuns e utilização
Dando a explicação anterior do padrão git clean
comportamentos e advertências, o seguinte conteúdo demonstra vários casos de utilização git clean
e as opções de linha de comandos necessárias para a sua operação.
-n
A opção -n
irá executar uma “execução a seco” de git clean
. Isto irá mostrar-lhe quais os ficheiros que serão removidos sem os remover de facto. É uma melhor prática executar sempre primeiro uma “dry run” de git clean
. Podemos demonstrar esta opção no demo repo que criámos anteriormente.
$ git clean -n Would remove untracked_file
A saída diz-nos que untracked_file
será removido quando o comando git clean
for executado. Note que o untracked_dir
não é reportado na saída aqui. Por padrão git clean
não irá operar recursivamente em diretórios. Este é outro mecanismo de segurança para evitar apagamentos acidentais permanentes.
-f or --force
A opção force inicia o apagamento real dos arquivos desempilhados do diretório atual. Forçar é necessário a menos que a opção de configuração clean.requireForce
seja definida como falsa. Isto não removerá pastas ou arquivos não rastreados especificados por .gitignore
. Vamos agora executar um live git clean
no nosso exemplo repo.
$ git clean -f Removing untracked_file
O comando irá sair os ficheiros que são removidos. Você pode ver aqui que untracked_file
foi removido. Executando git status
neste ponto ou fazendo um ls
irá mostrar que untracked_file
foi removido e não está em lugar nenhum. Por padrão, git clean -f
irá operar em todos os arquivos não rastreados do diretório atual. Adicionalmente, um valor pode ser passado com a opção -f
que irá remover um ficheiro específico.
git clean -f -d include directories
A opção -d
diz-lhe git clean
que também quer remover qualquer directório não rastreado, por defeito irá ignorar directórios. Podemos adicionar a opção -d
aos nossos exemplos anteriores:
$ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/
Aqui executamos um ‘dry run’ usando a combinação -dn
que sai untracked_dir
para remoção. Então nós executamos uma limpeza forçada, e recebemos uma saída que untracked_dir
é removida.
-x force removal of ignored files
Um padrão comum de lançamento de software é ter um diretório de compilação ou distribuição que não está comprometido com o índice de rastreamento dos repositórios. O diretório de compilação conterá artefatos de compilação efêmeros que são gerados a partir do código fonte comprometido. Este diretório de compilação é normalmente adicionado aos repositórios .gitignore
arquivo. Pode ser conveniente também limpar este diretório com outros arquivos não verificados. A opção -x
diz git clean
para também incluir quaisquer arquivos ignorados. Como com as anteriores git clean
invocações, é uma melhor prática executar primeiro uma ‘dry run’, antes da eliminação final. A opção -x
actuará em todos os ficheiros ignorados, e não apenas nos ficheiros específicos de compilação do projecto. Isto pode ser coisas não intencionais como arquivos de configuração ./.idea IDE.
git clean -xf
Tal como o -d
opção -x
pode ser passada e composta com outras opções. Este exemplo demonstra uma combinação com -f
que removerá arquivos não rastreados do diretório atual, bem como quaisquer arquivos que o Git normalmente ignora.
Modo interativo ou git clean interativo
Além da execução ad-hoc de linha de comando que temos demonstrado até agora, git clean
tem um modo “interativo” que você pode iniciar passando a opção -i
. Vamos revisitar o exemplo repo da introdução deste documento. Nesse estado inicial, iniciaremos uma sessão limpa interativa.
$ 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>
Iniciamos a sessão interativa com a opção -d
para que ela também atue sobre a nossa untracked_dir
. O modo interativo exibirá um prompt de What now>
que solicita um comando para aplicar aos arquivos desempilhados. Os comandos em si são bastante auto-explicativos. Vamos dar uma breve olhada em cada um deles numa ordem aleatória começando com o comando 6: help
. Seleccionando o comando 6 irá explicar melhor 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
Sai directamente da sessão interactiva.
1: clean
Eliminará os itens indicados. Se fossemos executar 1: clean
neste ponto untracked_dir/ untracked_file
seria removido.
4: ask each
Irá iterar sobre cada arquivo não rastreado e exibirá um prompt de Y/N
para 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/ ? N Remove untracked_file ? N
2: filter by pattern
Mostrará um prompt adicional que leva o input usado para filtrar a lista de ficheiros 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 introduzimos o padrão *_file
wildcard que depois restringe a lista de ficheiros não rastreados a apenas untracked_dir
.
3: select by numbers
Similiar ao comando 2, o comando 3 funciona para refinar a lista de nomes de ficheiros não rastreados. A sessão interativa irá 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
Para recapitular, git clean
é um método conveniente para excluir arquivos não rastreados no diretório de trabalho de um reporte. Os arquivos desempilhados são aqueles que estão no diretório do repo mas ainda não foram adicionados ao índice do repo com git add
. Em geral o efeito de git clean
pode ser realizado usando git status
e as ferramentas nativas de eliminação dos sistemas operativos. Git clean
pode ser usado juntamente com git reset
para desfazer completamente quaisquer adições e commits em um repositório.