Wie entferne ich nicht verfolgte Dateien in Git?

110

Ich arbeite an einem Zweig, sagen wir "experimenteller" Zweig, den ich von meinem Hauptzweig abzweige. Dann generiere ich ein Benutzermodell im experimentellen Zweig, füge sie aber noch nicht zum Index hinzu.

Was muss ich tun, wenn ich alle Änderungen der kürzlich in meinem experimentellen Zweig hinzugefügten Dateien verwerfen möchte? Die nicht verfolgten Dateien sind wie folgt aufgeführt:

$ 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

Ich habe versucht, "git reset --hard" auszuführen, in der Hoffnung, all diese Änderungen rückgängig zu machen, aber alle oben genannten Dateien werden weiterhin angezeigt.

Hat jemand bitte etwas Licht auf mich geworfen?

Sarun Sermsuwan
quelle

Antworten:

220

So entfernen Sie nicht verfolgte Dateien / Verzeichnisse:

git clean -fdx

-f - Kraft

-d - Verzeichnisse auch

-x - ignoriere auch entfernte Dateien (benutze dies nicht, wenn du ignorierte Dateien nicht entfernen willst)

Manojlds
quelle
54
Fügen Sie -n zur Vorschau zuerst hinzu, damit Sie nicht versehentlich
Dinge
8
Das ist toll! Es werden jedoch auch Konfigurationsdateien entfernt, die Sie in .gitignore möglicherweise absichtlich ignoriert haben, aber dennoch für Ihre lokale Entwicklungsumgebung benötigen. Sie können denselben Befehl mit dem Extra -i für den interaktiven Modus als solchen verwenden: git clean -fdxi und Sie werden gefragt, welche Dateien Sie löschen möchten.
Moeabdol
5
Dies ist großartig, aber Sie möchten den Benutzern möglicherweise einen Hinweis zur VERWENDUNG -xMIT VORSICHT hinzufügen, da dadurch Dateien dauerhaft gelöscht werden. Oder verwenden Sie mit -nwie von @
Druska
3
-xDas .project wurde noch nicht verwendet und andere Konfigurationsdateien wurden gelöscht. Musste das Repo vom letzten Commit erneut in ein neues Verzeichnis ziehen.
Zeitnehmer
2
Ich denke, Sie müssen informieren, dass dieser Befehl möglicherweise gefährlich ist, weil er gesuchte Dateien entfernen kann !!!
Davide
20

Benutzerinteraktiver Ansatz:

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 für interaktiv
-f für force
-d für Verzeichnis
-x für ignorierte Dateien (bei Bedarf hinzufügen)

Hinweis: Fügen Sie -n oder --dry-run hinzu, um nur zu überprüfen, was es tun wird.

bit_cracker007
quelle
17

Das sind nicht verfolgte Dateien. Dies bedeutet, dass Git sie nicht verfolgt. Sie werden nur aufgelistet, weil sie nicht in der git-Ignorierdatei enthalten sind. Da sie nicht von Git verfolgt werden, git resetwerden sie nicht berührt.

Wenn Sie alle nicht verfolgten Dateien wegblasen möchten, ist der einfachste Weg git clean -f(verwenden Sie git clean -nstattdessen, wenn Sie sehen möchten, was zerstört werden würde, ohne tatsächlich etwas zu löschen). Andernfalls können Sie die nicht gewünschten Dateien einfach von Hand löschen.

Lily Ballard
quelle
5

Zum Löschen nicht verfolgter Dateien:

git clean -f

Verwenden Sie zum Löschen auch nicht verfolgter Verzeichnisse:

git clean -f -d

Verwenden Sie zur Verhinderung eines Herzstillstands

git clean -n -f -d

Sonu Mishra
quelle
Jeder "Herzstillstand" 😂😂😂
Rishi Kulshreshtha
2

Sie können auch auf andere Weise zum vorherigen Status des lokalen Repos zurückkehren:

  1. Fügen Sie die nicht verfolgten Dateien zum Staging-Bereich mit hinzu git add.
  2. kehren Sie mit zum vorherigen Status des lokalen Repos zurück git reset --hard.
Tomasz Nazarenko
quelle
1

Der Befehl für Ihre Rettung lautet git clean.

Jagriti Kumari
quelle
0

Nun, ich hatte das ähnliche Problem. Ich hatte zuletzt genommen, aber es gab einige Änderungen in der lokalen, aufgrund derer die Zusammenführung nicht zu einer bestimmten Datei stattfand. Die Datei wurde nicht verfolgt und ich wollte sie nicht. Was ich tat, war -

$ git checkout Dateipfad / Dateiname

Dateipfad - Der Speicherort, von dem aus ich die Git-Bash durchgeführt habe. dann, als ich die letzten nahm, waren die Änderungen verfügbar

skb
quelle
0

Obwohl es git cleangut funktioniert, finde ich es immer noch nützlich, mein eigenes Skript zu verwenden, um das Git-Repo zu bereinigen, es hat einige Vorteile.

Dies zeigt eine Liste der zu bereinigenden Dateien an und fordert dann interaktiv zur Bereinigung auf oder nicht. Dies ist fast immer das, was ich möchte, da das interaktive Auffordern pro Datei mühsam wird.

Es ermöglicht auch das manuelle Filtern der Liste, was nützlich ist, wenn es Dateitypen gibt, die Sie nicht bereinigen möchten (und Grund haben, keine Festschreibung vorzunehmen).


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
quelle