como remover arquivos não rastreados no Git?

110

Estou trabalhando em um branch, digamos branch "experimental", que eu ramifico de meu branch master. Então, eu gerei um modelo de usuário no branch experimental, mas não os adiciono ao índice ainda.

O que devo fazer se quiser descartar todas as alterações dos arquivos recentemente adicionados em meu branch experimental? Os arquivos não rastreados estão listados abaixo:

$ git status
 On branch new_chick
 Untracked files:
   (use "git add <file>..." to include in what will be committed)

       .project
       app/models/user.rb
       db/migrate/
       test/fixtures/users.yml
       test/unit/user_test.rb

Tentei executar "git reset --hard" na esperança de desfazer todas essas alterações, mas todos os arquivos acima ainda aparecem.

Alguém, por favor, me ilumine?

Sarun Sermsuwan
fonte

Respostas:

220

Para remover arquivos / diretórios não rastreados, faça:

git clean -fdx

-f - força

-d - diretórios também

-x - remove arquivos ignorados também (não use isto se você não quiser remover arquivos ignorados)


Use com cuidado!
Esses comandos podem excluir arquivos arbitrários permanentemente, nos quais você não pensou a princípio. Por favor, verifique e leia todos os comentários abaixo desta resposta e da seção --help, etc., para saber todos os detalhes para ajustar seus comandos e certamente obter o resultado esperado.

manojlds
fonte
54
Adicione -n ​​para visualizar primeiro para não remover coisas acidentalmente
Druska
8
Isso é ótimo! Exceto que também removerá arquivos de configuração que você pode ter ignorado intencionalmente em .gitignore, mas ainda precisa para seu ambiente de desenvolvimento local. Você pode usar o mesmo comando com o -i extra para o modo interativo como: git clean -fdxi e ele irá perguntar quais arquivos você deseja deletar.
moeabdol,
5
Isso é ótimo, mas você pode querer adicionar um aviso aos usuários para USAR -xCOM CUIDADO, pois isso excluirá arquivos permanentemente. Ou use com -nconforme mencionado por @Druska
lacostenycoder
3
-xAinda não usei o .projeto e outros arquivos de configuração foram excluídos. Tive que puxar o repo novamente do último commit para um novo diretório.
cronometrista de
2
Acho que você tem que informar que este comando é potencialmente perigoso porque pode remover arquivos desejados !!!
Davide
20

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/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i para interativo
-f para force
-d para o diretório
-x para arquivos ignorados (adicione se necessário)

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

bit_cracker007
fonte
17

Esses são arquivos não rastreados. Isso significa que o git não está rastreando eles. Ele só os lista porque não estão no arquivo git ignore. Já que eles não estão sendo rastreados pelo git, git resetnão toque neles.

Se você quiser eliminar todos os arquivos não rastreados, a maneira mais simples é git clean -f(use git clean -nse quiser ver o que seria destruído sem realmente excluir nada). Caso contrário, você pode simplesmente excluir os arquivos que não deseja manualmente.

Lily Ballard
fonte
5

Para excluir arquivos não rastreados:

git clean -f

Para excluir diretórios não rastreados também, use:

git clean -f -d

Para prevenir qualquer parada cardíaca, use

git clean -n -f -d

Sonu Mishra
fonte
Qualquer "parada cardíaca" 😂😂😂
Rishi Kulshreshtha
2

Você também pode retornar ao estado anterior do repo local de outra maneira:

  1. Adicione os arquivos não rastreados à área de teste com git add.
  2. retornar ao estado anterior do repo local com git reset --hard.
Tomasz Nazarenko
fonte
1

O comando para o seu resgate é git clean.

Jagriti Kumari
fonte
0

Bem, eu tive um problema semelhante. Eu tinha pegado o mais recente, mas houve algumas mudanças no local devido às quais a mesclagem não estava acontecendo em um arquivo específico. O arquivo não foi rastreado e eu não os queria, então o que fiz foi -

$ git checkout filepath / filename

filepath - O local de onde fiz o git bash. então, quando peguei o mais recente, as alterações estavam disponíveis

skb
fonte
0

Enquanto git clean funcione bem, ainda acho útil usar meu próprio script para limpar o repositório git, ele tem algumas vantagens.

Isso mostra uma lista de arquivos a serem limpos e, em seguida, solicita interativamente para limpar ou não. Quase sempre isso é o que eu quero, já que solicitar interativamente por arquivo se torna tedioso.

Também permite a filtragem manual da lista, o que é útil quando há tipos de arquivo que você não deseja limpar (e tem motivos para não enviar).


git_clean.sh


#!/bin/bash
readarray -t -d '' FILES < <(
    git ls-files -z --other --directory |
        grep --null-data --null -v '.bin$\|Cargo.lock$'
)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi

echo "Dirty files:"
printf '  %s\n' "${FILES[@]}"

DO_REMOVE=0
while true; do
    echo ""
    read -p "Remove ${#FILES[@]} files? [y/n]: " choice
    case "$choice" in
        y|Y )
            DO_REMOVE=1
            break ;;
        n|N )
            echo "Exiting!"
            break ;;
        * ) echo "Invalid input, expected [Y/y/N/n]"
            continue ;;
    esac
done

if [ "$DO_REMOVE" -eq 1 ];then
    echo "Removing!"
    for f in "${FILES[@]}"; do
       rm -rfv "$f"
    done
fi
homem de idéias 42
fonte