jak usunąć nieśledzone pliki w Git?

110

Pracuję na gałęzi, powiedzmy „eksperymentalnej” gałęzi, którą rozgałęziam z mojej gałęzi głównej. Następnie generuję model użytkownika w gałęzi eksperymentalnej, ale jeszcze nie dodaję ich do indeksu.

Co mam zrobić, jeśli chcę odrzucić wszystkie zmiany plików ostatnio dodanych w mojej gałęzi eksperymentalnej? Nieśledzone pliki są wymienione poniżej:

$ 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

Próbowałem uruchomić "git reset --hard" w nadziei na cofnięcie wszystkich tych zmian, ale wszystkie powyższe pliki nadal się wyświetlają.

Czy ktoś mógłby rzucić na mnie trochę światła?

Sarun Sermsuwan
źródło

Odpowiedzi:

220

Aby usunąć nieśledzone pliki / katalogi, wykonaj:

git clean -fdx

-f - siła

-d - również katalogi

-x - usuń również ignorowane pliki (nie używaj tego, jeśli nie chcesz usuwać ignorowanych plików)


Używaj ostrożnie!
Te polecenia mogą trwale usunąć dowolne pliki, o których na początku nie pomyślałeś. Sprawdź dokładnie i przeczytaj wszystkie komentarze pod tą odpowiedzią i sekcją --help, itp., Aby poznać wszystkie szczegóły, aby dostosować polecenia i na pewno uzyskać oczekiwany rezultat.

manojlds
źródło
54
Najpierw dodaj -n do podglądu, aby przypadkowo nie usunąć rzeczy
Druska
8
To jest świetne! Z wyjątkiem tego, że usunie również pliki konfiguracyjne, które mogłeś celowo zignorować w .gitignore, ale nadal potrzebujesz w lokalnym środowisku programistycznym. Możesz użyć tego samego polecenia z dodatkowym -i dla trybu interaktywnego, na przykład: git clean -fdxi i zapyta, które pliki chcesz usunąć.
moeabdol
5
To świetnie, ale możesz chcieć dodać powiadomienie dla użytkowników, aby UŻYWAĆ -xOSTROŻNIE, ponieważ spowoduje to trwałe usunięcie plików. Lub użyj z, -njak wspomniano przez @Druska
lacostenycoder
3
Nie używany, -xnadal .project i inne pliki konfiguracyjne zostały usunięte. Musiałem ponownie ściągnąć repozytorium z ostatniego zatwierdzenia do nowego katalogu.
mierzący czas
2
Myślę, że musisz poinformować, że to polecenie jest potencjalnie niebezpieczne, ponieważ może usunąć pożądane pliki !!!
Davide,
20

Interaktywne podejście użytkownika:

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 dla interaktywnego
-f dla wymuszenia
-d dla katalogu
-x dla ignorowanych plików (dodaj, jeśli to konieczne)

Uwaga: Dodaj -n lub --dry-run, aby sprawdzić, co zrobi.

bit_cracker007
źródło
17

To nie są śledzone pliki. Oznacza to, że git ich nie śledzi. Wymienia je tylko dlatego, że nie ma ich w pliku ignorowania git. Ponieważ nie są śledzone przez gita, git resetnie dotykaj ich.

Jeśli chcesz zniszczyć wszystkie nieśledzone pliki, najprostszym sposobem jest git clean -f(użyj git clean -nzamiast tego, jeśli chcesz zobaczyć, co by to zniszczyło, nie usuwając niczego). W przeciwnym razie możesz po prostu ręcznie usunąć pliki, których nie chcesz.

Lily Ballard
źródło
5

Aby usunąć nieśledzone pliki:

git clean -f

Aby usunąć również nieśledzone katalogi, użyj:

git clean -f -d

Aby zapobiec zatrzymaniu krążenia, użyj

git clean -n -f -d

Sonu Mishra
źródło
Każde „zatrzymanie akcji serca” 😂😂😂
Rishi Kulshreshtha
2

Możesz także powrócić do poprzedniego stanu lokalnego repozytorium w inny sposób:

  1. Dodaj nieśledzone pliki do obszaru przemieszczania za pomocą git add.
  2. wróć do poprzedniego stanu lokalnego repozytorium z plikiem git reset --hard.
Tomasz Nazarenko
źródło
1

Polecenie na ratunek brzmi git clean.

Jagriti Kumari
źródło
0

Cóż, miałem podobny problem. Zrobiłem najnowsze, ale nastąpiły pewne zmiany w lokalnym, przez które scalanie nie działo się w określonym pliku. Plik był nieśledzony i nie chciałem ich, więc zrobiłem -

$ git checkout ścieżka / nazwa pliku

filepath - lokalizacja, z której wykonałem git bash. wtedy kiedy wziąłem najnowsze zmiany były dostępne

skb
źródło
0

Chociaż git cleandziała dobrze, nadal uważam, że przydatne jest używanie własnego skryptu do czyszczenia repozytorium git, ma to jednak pewne zalety.

Wyświetla listę plików do wyczyszczenia, a następnie interaktywnie monituje o wyczyszczenie lub nie. Prawie zawsze tego chcę, ponieważ interaktywne monitowanie o plik staje się żmudne.

Umożliwia także ręczne filtrowanie listy, co jest przydatne, gdy istnieją typy plików, których nie chcesz czyścić (i masz powód, aby nie zatwierdzać).


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
ideasman42
źródło