Como remover arquivos locais (não rastreados) da árvore de trabalho atual do Git

6843

Como você exclui arquivos locais não rastreados da sua árvore de trabalho atual?

Somente leitura
fonte
86
Esta folha de dicas interativa do git ndpsoftware.com/git-cheatsheet.html mostra a área de trabalho do git (o Google fornece melhores resultados com "área de trabalho" do que "cópia de trabalho").
Qneill
28
Nota: se você deseja remover apenas alguns arquivos não rastreados, mas não todos , git cleanagora tem um modo interativo ! Veja minha resposta a esta outra pergunta : git 1.8.4+
VonC
17
Observe que você não está removendo arquivos do branch git, pois o branch é uma referência a uma confirmação e, portanto, não contém arquivos não rastreados. Eles estão presentes apenas no diretório de trabalho e não têm nada a ver com ramificações. Provavelmente isso é apenas um esclarecimento terminológico.
Pavel Šimerda 14/09
6
Para esclarecer o entendimento do status não iniciado e dos novos no Git - execute git e se ele mostra um arquivo como não rastreado e você não deseja esse arquivo no repositório, basta ir ao seu sistema de arquivos e excluí-lo ou movê-lo . Isso não fará nada de ruim ao seu repositório local ou ao Git. Você também pode usar git cleanou alguma variação nas respostas abaixo, incluindo a versão interativa para excluir apenas arquivos seletivos, mas o modo interativo pode ser entediante. Faça o que fizer, compreenda o que git cleanserá excluído ou usado --dry-runpara que ele seja informado sem excluir nada.
LightCC
4
Se os arquivos ainda não estão sendo rastreados, você não pode removê-los sem o git? rm files-to-be-deleted
mhatch

Respostas:

8734

git-clean - Remove arquivos não rastreados da árvore de trabalho

Sinopse

git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>…​

Descrição

Limpa a árvore de trabalho removendo recursivamente os arquivos que não estão sob controle de versão, iniciando no diretório atual .

Normalmente, apenas os arquivos desconhecidos pelo Git são removidos, mas se a -xopção for especificada, os arquivos ignorados também serão removidos. Por exemplo, isso pode ser útil para remover todos os produtos de construção.

Se algum <path>...argumento opcional for fornecido, apenas esses caminhos serão afetados.


A etapa 1 é mostrar o que será excluído usando a -nopção:

# Print out the list of files which will be removed (dry run)
git clean -n

Etapa limpa - cuidado: isso excluirá arquivos :

# Delete the files from the repository
git clean -f
  • Para remover diretórios, execute git clean -f -dougit clean -fd
  • Para remover arquivos ignorados, execute git clean -f -Xougit clean -fX
  • Para remover arquivos ignorados e não ignorados, execute git clean -f -xougit clean -fx

Observe a diferença entre maiúsculas e minúsculas nos Xdois últimos comandos.

Se clean.requireForceestiver definido como "true" (o padrão) em sua configuração, será necessário especificar -fcaso contrário, nada realmente acontecerá.

Veja novamente os git-cleandocumentos para obter mais informações.


Opções

-f, --force

Se a variável de configuração Git clean.requireForce não estiver definida como false, o git clean se recusará a executar, a menos que seja fornecido -f, -nou -i.

-x

Não use as regras padrão de ignorar lidas em .gitignore (por diretório) e $GIT_DIR/info/exclude, mas ainda use as regras de ignorar fornecidas com as -eopções. Isso permite remover todos os arquivos não rastreados, incluindo produtos de construção. Isso pode ser usado (possivelmente em conjunto com o git reset) para criar um diretório de trabalho novo para testar uma compilação limpa.

-X

Remova apenas os arquivos ignorados pelo Git. Isso pode ser útil para reconstruir tudo do zero, mas mantenha os arquivos criados manualmente.

-n, --dry-run

Na verdade, não remova nada, apenas mostre o que seria feito.

-d

Remova os diretórios não rastreados, além dos arquivos não rastreados. Se um diretório não rastreado for gerenciado por um repositório Git diferente, ele não será removido por padrão. Use a -fopção duas vezes se você realmente deseja remover esse diretório.

Ashkan Sirous
fonte
288
git clean -ffunciona apenas no diretório em que é chamado (e subdiretórios). Se você deseja limpar toda a cópia de trabalho, chame-a em seu diretório raiz.
Eduardo Bezerra
17
Também está removendo todos os arquivos dentro do .gitignore. Eu preciso excluir apenas os arquivos / pastas que são novos e não em .gitignore
Kostanos
24
@Kostanos Se você não deseja remover os arquivos que estão no .gitignore, não forneça o sinalizador -x.
Lo-Tan
52
git clean -f :/funciona como se você o tivesse executado no diretório de repositório raiz. Veja também respostas posteriores que também representam sub-módulos comgit clean -ffxd :/
aqui
18
@Michelle git -xfd limpa vai também remover todos os arquivos atualmente ignorado na SUA .gitignore e eles não são reembolsáveis
thedanotto
987

Use git clean -f -dpara garantir que os diretórios também sejam removidos.

  1. Na verdade, não remova nada, apenas mostre o que seria feito.

    git clean -n
    

    ou

    git clean --dry-run
    
  2. Remova os diretórios não rastreados, além dos arquivos não rastreados. Se um diretório não rastreado for gerenciado por um repositório Git diferente, ele não será removido por padrão. Use a -fopção duas vezes se você realmente deseja remover esse diretório.

    git clean -fd
    

Você pode então verificar se seus arquivos foram realmente usados git status.

robert.berger
fonte
115
Como mencionado anteriormente, é bom executá-lo a secogit clean -n -d
Ms01
15
A mesma coisa é fazer git clean -nde git clean -fd.
Micer
478

Estou surpreso que ninguém tenha mencionado isso antes:

git clean -i

Isso significa interativo e você terá uma rápida visão geral do que será excluído, oferecendo a possibilidade de incluir / excluir os arquivos afetados. No geral, ainda mais rápido do que executar o obrigatório --dry-runantes da limpeza real.

Você terá que jogar um arquivo -dse quiser também cuidar de pastas vazias. No final, cria um bom alias:

git iclean

Dito isto, a exploração manual adicional de comandos interativos pode ser cansativa para usuários experientes. Hoje em dia eu só uso o já mencionadogit clean -fd

SystematicFrank
fonte
16
@ pal4life Foi adicionado na 1.8.4, você pode estar executando uma versão mais antiga do git? github.com/git/git/blob/master/Documentation/RelNotes/1.8.4.txt
Mattias Backman
Eu gosto disso - estou mais confortável em tê-lo no meu histórico do bash do que em qualquer outra opção, porque não é grande coisa se eu acidentalmente pressionar Ctrl-R ou Ctrl-p nele.
Csvoss 21/10/19
Será que git clean -ifunciona apenas se chamado a partir da raiz da cópia de trabalho?
Alessandro Jacopson
250

Se o diretório não rastreado for seu próprio repositório git (por exemplo, submódulo), você precisará usar -fduas vezes:

git clean -d -f -f

Michał Szajbe
fonte
4
BTW, isso está escrito na documentação : O Git se recusará a excluir diretórios com o subdiretório ou arquivo .git, a menos que um segundo -f seja fornecido. Mas obrigada mesmo assim!
Maxim Suslov
248

Maneira simples de remover arquivos não rastreados

Para remover todos os arquivos não rastreados, a maneira mais simples é adicionar todos eles primeiro e redefinir o repositório, conforme abaixo

git add --all
git reset --hard HEAD

Thanga
fonte
8
Você pode substituir git add --allpor git add .. Portanto, você pode fazer isso de forma mais curta na linha git add . && git reset --hard HEAD (tenha muito cuidado com este comando) .
RousseauAlexandre
22
Por que usar isso de novo git clean?
user2864740
8
Porque git cleanaparentemente também exclui tudo o que é ignorado. Apenas excluiu minha node_modulespasta. Fazer isso primeiro prepararia todos os arquivos, exceto os ignorados, e os excluiria fazendo uma redefinição. Arquivos ignorados não serão tocados.
Andreas
5
@ Andreas, ele não exclui arquivos ignorados para mim (git 2.14.1). Você deve executar degit clean -n qualquer maneira antes de fazer a exclusão real (ou usar git clean -i).
Qw3ry
8
git cleanexclui os arquivos ignorados apenas se você usar a opção -xou -X, caso contrário, apenas os arquivos não rastreados.
doubleDown 26/09
140

Eu gosto git stash push -uporque você pode desfazer todos eles git stash pop.

EDIT: Também encontrei uma maneira de mostrar o arquivo não rastreado em um stash (por exemplo git show stash@{0}^3) https://stackoverflow.com/a/12681856/338986

EDIT2: git stash savefoi preterido em favor de push. Obrigado @ script-wolf.

hiroshi
fonte
3
Você pode explicar o -u no esconderijo? Não sigo como isso funciona de maneira diferente do git stash save. Eu tentei isso e funcionou. Observava documentos do Git e também não conseguia encontrá-lo.
Winnemucca
9
-ué equivalente a --include-untracked. Você pode encontrar uma ajuda com git help stash.
Hiroshi
3
@hiroshi Thanks! depois de tentar todas as soluções de uma dúzia de pessoas diferentes, essa é a que finalmente funcionou ... ufa! Mesmo um esconderijo não fez nada. O salvador cuidou de não rastreado. redefinir força forte / limpa / etc nada disso fez nada por mim.
killjoy
3
A saveopção foi preterida em favor de push, que faz o mesmo, mas mais. Você pode ler mais aqui, /programming/44680028/whats-the-difference-between-git-stash-save-and-git-stash-push/44681952
Script Wolf
120

É isso que eu sempre uso:

git clean -fdx

Para um projeto muito grande, você pode executá-lo algumas vezes.

Oscar Fraxedas
fonte
@ Martin Um dos projetos em que estou trabalhando é +8 anos, com +80 desenvolvedores codificando ativamente. Às vezes, o Git falha ao limpá-lo na primeira passagem.
Oscar Fraxedas
1
Posso confirmar isso, então isso ainda é válido em 2020. Também estamos trabalhando em um projeto grande e tive que executá-lo 4-5 vezes até o GIT não encontrar mais arquivos a serem excluídos.
turbolocust 17/04
90

git-clean é o que você está procurando. É usado para remover arquivos não rastreados da árvore de trabalho.

Espo
fonte
86

Se necessário, para remover arquivos não rastreados de um subdiretório específico,

git clean -f {dir_path}

E maneira combinada de excluir diretórios / arquivos não rastreados e arquivos ignorados.

git clean -fxd {dir_path}

depois disso, você terá arquivos modificados apenas em git status.

Vijay C
fonte
68

Remova todas as pastas e arquivos extras neste sub-módulo repo +

Isso leva você ao mesmo estado que o novo clone.

git clean -ffdx

Remova todas as pastas e arquivos extras neste repositório, mas não seus submódulos

git clean -fdx

Remova pastas extras, mas não arquivos (por exemplo, pasta build ou logs)

git clean -fd

Remova pastas extras + arquivos ignorados (mas não os arquivos adicionados recentemente)

Se o arquivo não foi ignorado e ainda não fez check-in, ele permanece. Observe a capital X.

git clean -fdX

Novo modo interativo

git clean
Shital Shah
fonte
57

git clean -fd remove diretório

git clean -fX remove arquivos ignorados

git clean -fx remove arquivos ignorados e não ignorados

pode ser usado todas as opções acima em combinação como

git clean -fdXx

verifique o manual do git para obter mais ajuda

Pooja
fonte
10
O comando git clean -fdXxproduz a mensagem de erro "fatal: -x e -X não podem ser usados ​​juntos" (usando git-2.8). Para sua última frase dentro da sua resposta, forneça um link para o manual do git. Cheers
olibre 04/07
execute os dois comandos em sequência: git clean -fdX, git clean -fdx
Clock ZHONG
55

OK, é fácil excluir arquivos e pastas não rastreados indesejadosgit na linha de comando, basta fazer o seguinte:

git clean -fd

Verifique novamente antes de fazer isso, pois excluirá os arquivos e pastas sem fazer nenhum histórico ...

Também neste caso, -fsignifica força e-d significa diretório ...

Portanto, se você quiser excluir apenas arquivos, poderá usar -fapenas:

git clean -f

Se você deseja excluir (diretórios) e arquivos, é possível excluir apenas diretórios e arquivos não rastreados como este:

git clean -fd

Além disso, você pode usar o -xsinalizador para incluir os arquivos que são ignorados pelo git. Isso seria útil se você deseja excluir tudo.

E adicionando -isinalizador, o git solicita permissão para excluir arquivos um por um em qualquer lugar.

Se você não tiver certeza e deseja verificar as coisas primeiro, adicione -nsinalizador.

Use -qse você não quiser ver nenhum relatório após a exclusão bem-sucedida.

Também crio a imagem abaixo para torná-la mais memorável, especialmente já vi muitas pessoas confundirem -fpor limpar a pasta às vezes ou misturá-la de alguma forma!


excluir arquivos e pastas não rastreados indesejados

Alireza
fonte
O que há com essa imagem?
Pacerier 30/01
37

Uma maneira melhor é usar: git clean

git clean -d -x -f

Isso remove arquivos não rastreados, incluindo diretórios (-d)e arquivos ignorados por git (-x).

Além disso, substitua o -fargumento por -npara executar um dry-runou -ipara o modo interativo e ele informará o que será removido.

Chhabilal
fonte
25

Abordagem interativa do usuário:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/arsdumpgenerator/s3/ [y/N]? y

-i para interativo
-f para forçar
-d para o diretório
-x para arquivos ignorados (inclua se necessário)

Nota: Adicione -n ou --dry-run para verificar apenas o que ele fará.

bit_cracker007
fonte
20

Um truque para essa situação que acabei de inventar e experimentar (que funciona perfeitamente):

git add .
git reset --hard HEAD

Cuidado! Certifique-se de confirmar as alterações necessárias (mesmo em arquivos não rastreados) antes de fazer isso .

thybzi
fonte
3
Pelo menos essa é uma abordagem diferente. :) Outra maneira, que se lembraria os arquivos apagados no reflog, mas não em todas as filiais, seria:git add . git commit -m 'about to delete' git reset --hard HEAD~
joeytwiddle
2
maneira ainda mais rápida égit add . && git reset --hard HEAD
thybzi 29/04
3
git add . && git reset --hard
Pleymor 19/07
Pode não ser o que você deseja se também houver alterações que você deseja confirmar.
lacostenycoder
O @AlexanderMills git reset --hardredefine todas as alterações não confirmadas, mas os arquivos não rastreados para o estado da confirmação mais recente. É por isso que primeiro é necessário git add .- que organiza todos os arquivos untracked (assim eles são repostos, também)
thybzi
19

git clean -f -d -x $(git rev-parse --show-cdup)aplica-se limpo ao diretório raiz, não importa onde você o chame em uma árvore de diretórios do repositório. Eu o uso o tempo todo, pois não o força a deixar a pasta em que você está trabalhando agora e permite limpar e confirmar o local onde está.

Certifique-se de que as bandeiras -f, -d, -xcorresponder às suas necessidades:

-d
       Remove untracked directories in addition to untracked files. If an
       untracked directory is managed by a different Git repository, it is
       not removed by default. Use -f option twice if you really want to
       remove such a directory.

-f, --force
       If the Git configuration variable clean.requireForce is not set to
       false, git clean will refuse to delete files or directories unless
       given -f, -n or -i. Git will refuse to delete directories with .git
       sub directory or file unless a second -f is given. This affects
       also git submodules where the storage area of the removed submodule
       under .git/modules/ is not removed until -f is given twice.

-x
       Don't use the standard ignore rules read from .gitignore (per
       directory) and $GIT_DIR/info/exclude, but do still use the ignore
       rules given with -e options. This allows removing all untracked
       files, including build products. This can be used (possibly in
       conjunction with git reset) to create a pristine working directory
       to test a clean build.

Existem outras bandeiras também disponíveis, basta verificar git clean --help.

Nikita Leonov
fonte
BTW, você pode simplesmente fazer o git clean {flags}: / assim será como se você executasse o comando na raiz
do repositório
19

Para mim somente o seguinte funcionou:

git clean -ffdx

Em todos os outros casos, eu recebia a mensagem "Ignorando Diretório" para alguns subdiretórios.

rahul286
fonte
2
Obrigado. Eu deixei de fora o -xe apenas usei git clean -ffdpara evitar apagar arquivos no .gitignore.
Feckmore
15

Se você deseja excluir os arquivos listados como não rastreados por 'status git'

git stash save -u
git stash drop "stash@{0}"

Eu prefiro isso para 'git clean' porque 'git clean' excluirá os arquivos ignorados pelo git, portanto, sua próxima compilação precisará reconstruir tudo e você também poderá perder as configurações do IDE.

jazzdev
fonte
3
Isso também removerá alterações válidas nos arquivos rastreados. Eu não recomendaria.
precisa saber é o seguinte
2
Sim, você deseja confirmar as alterações nos arquivos rastreados primeiro.
jazzdev
14

Para saber o que será excluído antes de excluir:

git clean -d -n

Ele produzirá algo como:

Removeria sample.txt

Para excluir tudo listado na saída do comando anterior:

git clean -d -f

Ele produzirá algo como:

Removendo sample.txt

Omar Mowafi
fonte
11

Para remover os arquivos não rastreados, você deve primeiro usar o comando para exibir os arquivos que serão afetados pela limpeza

git clean -fdn

Isso mostrará a lista de arquivos que serão excluídos. Agora, para realmente excluir esses arquivos, use este comando:

git clean -fd
Gaurav
fonte
11

Tenha cuidado ao executar o comando `git clean`.

Sempre use -n antes de executar o comando real, pois ele mostrará quais arquivos serão removidos.

git clean -n -d 
git clean -f -d

Por padrão, git cleanapenas remove arquivos não rastreados que não são ignorados. Qualquer arquivo que corresponda a um padrão no seu arquivo .gitignore ou em outros arquivos ignorados não será removido. Se você deseja remover esses arquivos também, pode adicionar um -xao comando clean.

git clean -f -d -x

Há também o modo interativo disponível -icom o comando clean

git clean -x -i

alternativamente

Se você não tiver 100% de certeza de que a exclusão de seu trabalho não confirmado é segura, use a ocultação

git stash --all

Ele também limpa seu diretório, mas oferece flexibilidade para recuperar os arquivos a qualquer momento, usando stash com apply ou pop . Então, mais tarde, você pode limpar seu estoque usando:

git stash drop // or clean
DevWL
fonte
2
o estoque é uma boa idéia, no entanto, você pode querer usargit stash save and type some comment as to what this stash was for
lacostenycoder
9

git clean -f to remove untracked files from working directory.

Eu cobri alguns conceitos básicos aqui no meu blog, git-intro-basic-command

ysk
fonte
9

O comando uggested para remover arquivos não rastreados do git docs é git clean

git clean - Remove arquivos não rastreados da árvore de trabalho

Método sugerido: Modo Interativo usando git clean -i para que possamos ter controle sobre ele. vamos ver as opções disponíveis restantes.

Opções disponíveis:

git clean 
    -d -f -i -n -q -e -x -X (can use either)

Explicação:

1. -d

Remova os diretórios não rastreados, além dos arquivos não rastreados. Se um diretório não rastreado for gerenciado por um repositório Git diferente, ele não será removido por padrão. Use a opção -f duas vezes se você realmente deseja remover esse diretório.

2. -f, --force

Se a variável de configuração do Git clean.requireForce não estiver configurada como false, o git clean se recusará a executar, a menos que seja fornecido -f, -n ou -i.

3. -i, - interativo

Mostre o que seria feito e limpe os arquivos interativamente. Consulte "Modo interativo" para obter detalhes.

4. -n, --dry-run

Na verdade, não remova nada, apenas mostre o que seria feito.

5. -q, --quiet

Fique quieto, apenas relate erros, mas não os arquivos que foram removidos com sucesso.

6. -e, --exclude =

Além dos encontrados em .gitignore (por diretório) e $ GIT_DIR / info / exclude, também considere esses padrões no conjunto das regras de ignorar em vigor.

7. -x

Não use as regras padrão de ignorar lidas em .gitignore (por diretório) e $ GIT_DIR / info / exclude, mas ainda use as regras de ignorar fornecidas com as opções -e. Isso permite remover todos os arquivos não rastreados, incluindo produtos de compilação. Isso pode ser usado (possivelmente em conjunto com o git reset) para criar um diretório de trabalho novo para testar uma compilação limpa.

8. -X

Remova apenas os arquivos ignorados pelo Git. Isso pode ser útil para reconstruir tudo do zero, mas mantenha os arquivos criados manualmente.

Mohideen bin Mohammed
fonte
Eu acho que você tem um erro de digitação, uggestedmas isso é apenas um " uggestionlol "
lacostenycoder
8

O git cleancomando normal não remove arquivos não rastreados com o meu git version 2.9.0.windows.1.

$ git clean -fdx     # doesn't remove untracked files
$ git clean -fdx *   # Append star then it works!
kujiy
fonte
7

Podemos facilmente remover arquivos não rastreados locais da árvore de trabalho atual do git usando os comentários abaixo do git.

git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

Exemplo:

git reset --hard HEAD

Ligações:

  1. https://git-scm.com/docs/git-reset
  2. Como uso o 'git reset --hard HEAD' para reverter para um commit anterior?
  3. Redefina a ramificação do repositório local para ser como o repositório remoto HEAD
  4. https://jwiegley.github.io/git-from-the-bottom-up/3-Reset/4-doing-a-hard-reset.html
Elangovan
fonte
Isso também removerá as alterações preparadas para confirmação, não apenas os arquivos não rastreados, que podem não ser o que você deseja.
87819
Não funciona: deixa alguns arquivos. git clean -ffdxé a solução
Eugene Gr. Philippov
7

Limpar o repositório git e todos os submódulos recursivamente

O comando a seguir limpará o repositório git atual e todos os seus submódulos recursivamente:

(git clean -d -x -f && git submodule foreach --recursive git clean -d -x -f)
Sergey
fonte
certamente isso deve ser usado com grande cautela
lacostenycoder
6
git clean -f

removerá os arquivos não rastreados do git atual

git clean -fd

quando você deseja remover diretórios e arquivos, isso excluirá apenas diretórios e arquivos não rastreados

Sudhir Vishwakarma
fonte
5

O oh-my-zsh com zsh fornece esses ótimos aliases através do plugin git. Eles também podem ser usados ​​no bash.

gclean='git clean -fd'
gpristine='git reset --hard && git clean -dfx'

  • gclean remove diretórios não rastreados, além de arquivos não rastreados .
  • gpristineredefina as alterações locais, remova diretórios não rastreados, arquivos não rastreados e não use as regras padrão de ignorar lidas em .gitignore (por diretório) e $ GIT_DIR / info / exclude, mas ainda use as regras de ignorar fornecidas com as opções -e. Isso permite remover todos os arquivos não rastreados, incluindo produtos de construção. Isso pode ser usado (possivelmente em conjunto com o git reset) para criar um diretório de trabalho novo para testar uma compilação limpa .
ZenLulz
fonte
2
Obrigado pelo seu feedback, minha declaração foi confusa. Eu queria dizer que os aliases destacados vêm automaticamente com oh-my-zsh. Obviamente, eles funcionam muito bem bash. Eu editei minha resposta para refletir isso.
ZenLulz
4

Eu gosto de usar o git stashcomando, mais tarde você pode obter arquivos escondidos e alterações. git cleantambém é uma boa opção, mas depende totalmente de sua necessidade. aqui está a explicação do git stash e do git clean, 7.3 Git Tools - Armazenamento e limpeza

Zia
fonte