zurücksetzen - git zeige commits




Wie kann man Git „vergessen“, wenn eine Datei verfolgt wurde, die sich jetzt in.gitignore befindet? (14)

Es gibt eine Datei, die von git verfolgt wurde, aber jetzt befindet sich die Datei in der .gitignore Liste.

Diese Datei wird jedoch nach der Bearbeitung immer im git status angezeigt. Wie zwingt man git dazu, das komplett zu vergessen?


Verwenden Sie dies, wenn:

1. Sie möchten viele Dateien abbrechen, oder

2. Sie haben Ihre Gitignore-Datei aktualisiert

Quelllink: http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Angenommen, Sie haben bereits einige Dateien zu Ihrem Git-Repository hinzugefügt / festgelegt und fügen diese dann Ihrem .gitignore hinzu. Diese Dateien sind noch in Ihrem Repository-Index vorhanden. In diesem Artikel werden wir sehen, wie wir sie loswerden können.

Schritt 1: Übernehmen Sie alle Ihre Änderungen

Stellen Sie vor dem Fortfahren sicher, dass alle Ihre Änderungen festgeschrieben sind, einschließlich Ihrer .gitignore-Datei.

Schritt 2: Entfernen Sie alles aus dem Repository

Um Ihr Repo zu löschen, verwenden Sie:

git rm -r --cached .
  • rm ist der Befehl zum Entfernen
  • -r erlaubt das rekursive Entfernen
  • –Cached entfernt nur Dateien aus dem Index. Ihre Dateien werden immer noch da sein.

Der Befehl rm kann unerbittlich sein. Wenn Sie das vorher ausprobieren möchten, fügen Sie das Flag -n oder --dry-run , um die Dinge zu testen.

Schritt 3: Alles neu hinzufügen

git add .

Schritt 4: Commit

git commit -m ".gitignore fix"

Dein Repository ist sauber :)

Drücken Sie die Änderungen auf Ihre Fernbedienung, um die Änderungen auch dort zu sehen.


Was für mich nicht funktioniert hat

(Unter Linux) wollte ich die Beiträge verwenden, die die ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached -Ansatz. (Einige der zu entfernenden Dateien hatten jedoch eine eingebettete Zeile / LF / \n in ihren Namen). Keine der Lösungen:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Bewältigen Sie diese Situation (erhalten Sie Fehler über nicht gefundene Dateien).

Also biete ich an

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached

Dies verwendet das Argument -z für ls-files und das Argument -0 für xargs , um sicher / korrekt auf "böse" Zeichen in Dateinamen zu reagieren.

In der Handbuchseite git-ls-files (1) heißt es:

Wenn die Option -z nicht verwendet wird, werden die TAB-, LF- und Backslash-Zeichen in Pfadnamen als \ t, \ n bzw. \\ dargestellt.

Ich denke, meine Lösung ist notwendig, wenn Dateinamen diese Zeichen enthalten.

BEARBEITEN: Ich wurde gebeten, das hinzuzufügen - wie jeder Befehl von git rm - diesem muss ein Commit folgen, um die Entfernungen dauerhaft zu machen, z. B. git commit -am "Remove ignored files" .


Das BFG speziell für das Entfernen unerwünschter Daten wie großer Dateien oder Passwörter aus Git-Repos entwickelt. Daher verfügt es über ein einfaches Flag, das alle großen historischen (nicht in Ihrem aktuellen Status befindlichen) Dateien entfernt: '--strip-blobs- größer als'

$ java -jar bfg.jar --strip-blobs-bigger-than 100M

Wenn Sie Dateien nach Namen angeben möchten, können Sie dies auch tun:

$ java -jar bfg.jar --delete-files *.mp4

Das BFG ist 10-1000-mal schneller als Git-Filter-Zweig und im Allgemeinen viel einfacher zu verwenden. Weitere Informationen finden Sie in den vollständigen Gebrauchsanweisungen und examples .

Quelle: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html


Die Antwort von Matt Fear war der effektivste IMHO. Das Folgende ist nur ein PowerShell-Skript für Windows-Benutzer, das nur Dateien aus ihrem Git-Repo entfernt, die ihrer Ausschlussliste entsprechen.

# Get files matching exclusionsfrom .gitignore
# Excluding comments and empty lines
$ignoreFiles =  gc .gitignore | ?{$_ -notmatch  "#"} |  ?{$_ -match  "\S"} | % {
                    $ignore = "*" + $_ + "*"
                    (gci -r -i $ignore).FullName
                }
$ignoreFiles = $ignoreFiles| ?{$_ -match  "\S"}

# Remove each of these file from Git 
$ignoreFiles | % { git rm $_}

git add .

Führen Sie die folgenden Schritte der Reihe nach durch.

1. Entfernen Sie die versehentlich hinzugefügten Dateien aus dem Verzeichnis / storage . Sie können den Befehl "rm -r" (für Linux) verwenden oder sie löschen, indem Sie die Verzeichnisse durchsuchen.

2. Fügen Sie die Dateien / Verzeichnisse jetzt der gitignore Datei hinzu und speichern Sie sie.

3. entfernen Sie sie mit diesen Befehlen aus dem git cache (Wenn es mehr als ein Verzeichnis gibt, entfernen Sie sie nacheinander, indem Sie diesen Befehl wiederholt ausgeben).

git rm -r --cached path-to-those-files

4. Jetzt ein Commit und Push ausführen, diese Befehle verwenden. Dadurch werden diese Dateien von git remote entfernt und git beendet , diese Dateien zu verfolgen .

git add .
git commit -m "removed unnecessary files from git"
git push origin

Ich denke, dass git Dateien aufgrund ihrer Konzeption möglicherweise nicht ganz vergessen kann ( Abschnitt "Snapshots, Not Differences" ).

Dieses Problem ist beispielsweise bei der Verwendung von CVS nicht vorhanden. CVS speichert Informationen als Liste dateibasierter Änderungen. Informationen für CVS sind eine Reihe von Dateien und die im Laufe der Zeit an jeder Datei vorgenommenen Änderungen.

Bei jedem Commit oder Speichern des Status Ihres Projekts in Git wird jedoch im Grunde genommen ein Bild davon gemacht, wie alle Ihre Dateien in diesem Moment aussehen, und es wird ein Verweis auf diesen Schnappschuss gespeichert . Wenn Sie also eine Datei einmal hinzugefügt haben, ist sie immer in diesem Schnappschuss vorhanden.

Diese 2 Artikel waren hilfreich für mich:

git davon ausgehen, dass es sich nicht um einen Vergleich zwischen überspring-worktree und um Änderungen in nachverfolgten Dateien mit Git handelt

Darauf basierend mache ich Folgendes, wenn die Datei bereits verfolgt ist:

git update-index --skip-worktree <file>

Ab diesem Zeitpunkt werden alle lokalen Änderungen in dieser Datei ignoriert und gehen nicht in die Ferne über. Wenn die Datei auf der Fernbedienung geändert wird, tritt ein Konflikt auf, wenn git pull . Stash funktioniert nicht. Um es aufzulösen, kopieren Sie den Dateiinhalt an den sicheren Ort und führen Sie folgende Schritte aus:

git update-index --no-skip-worktree <file>
git stash
git pull 

Der Dateiinhalt wird durch den Remote-Inhalt ersetzt. Fügen Sie Ihre Änderungen von einem sicheren Ort in eine Datei ein und führen Sie sie erneut aus:

git update-index --skip-worktree <file>

Wenn jeder, der mit project arbeitet, git update-index --skip-worktree <file> pull sollten pull Probleme nicht auftreten. Diese Lösung ist für Konfigurationsdateien in Ordnung, wenn jeder Entwickler über eine eigene Projektkonfiguration verfügt.

Es ist nicht sehr praktisch, dies jedes Mal zu tun, wenn die Datei auf der Fernbedienung geändert wurde, sie kann jedoch vor dem Überschreiben durch Ferninhalt schützen.


Ich mochte JonBraves Antwort, aber ich habe unordentlich genug Arbeitsverzeichnisse, die begehen -a macht mir ein bisschen Angst, also habe ich folgendes getan:

git config --global alias.exclude-ignored '! git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached && git ls-files -z --ignored --exclude-standard | xargs -0 git stage && git stage .gitignore && git commit -m "Neuer Gititore und entfernte ignorierte Dateien aus dem Index" "

Brechen sie ab:

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 
git ls-files -z --ignored --exclude-standard | xargs -0 git stage 
git stage .gitignore 
git commit -m "new gitignore and remove ignored files from index"
  • ignorierte Dateien aus dem Index entfernen
  • Bühne .gitignore und die Dateien, die Sie gerade entfernt haben
  • verpflichten

Ich verwende diesen Befehl immer zum Entfernen dieser nicht protokollierten Dateien. Einzeilige, unixartige, saubere Ausgabe:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Es listet alle Ihre ignorierten Dateien auf, ersetzen Sie jede Ausgabezeile durch eine in Anführungszeichen gesetzte Zeile, um Pfade mit Leerzeichen zu behandeln, und übergeben Sie alles an git rm -r --cached , um die Pfade / Dateien / Verzeichnisse aus dem Index zu entfernen.


Verschiebe es, setze, dann verschiebe es wieder hinein. Das hat in der Vergangenheit für mich funktioniert. Es gibt wahrscheinlich eine bessere Methode, um dies zu erreichen.


Verschieben oder kopieren Sie die Datei an einen sicheren Ort, damit Sie sie nicht verlieren. Dann git rm die Datei und Commit. Die Datei wird weiterhin angezeigt, wenn Sie zu einem dieser früheren Commits oder einem anderen Zweig zurückkehren, in dem sie nicht entfernt wurde. Bei allen zukünftigen Commits wird die Datei jedoch nicht mehr angezeigt. Wenn sich die Datei in git ignore befindet, können Sie sie wieder in den Ordner verschieben, und git wird sie nicht sehen.


Wenn Sie eine verfolgte Datei nicht erstellen können, weil andere Personen sie möglicherweise benötigen (Warnung, auch wenn Sie git rm --cached , werden diese Dateien bei einem anderen git rm --cached im Dateisystem gelöscht). Dies geschieht häufig aufgrund von Konfigurationsdatei-Überschreibungen, Authentifizierungsinformationen usw. Weitere Informationen finden Sie unter https://gist.github.com/1423106 .

Zusammenfassen:

  • Lassen Sie Ihre Anwendung nach einer ignorierten Datei config-overide.ini suchen und verwenden Sie diese für die festgeschriebene Datei config.ini (oder suchen Sie alternativ nach ~ / .config / myapp.ini oder $ MYCONFIGFILE).
  • Übertragen Sie die Datei config-sample.ini und ignorieren Sie die Datei config.ini. Lassen Sie die Datei ggf. mit einem Skript oder einem ähnlichen Skript kopieren.
  • Versuchen Sie, gitattributes clean / smudge magic anzuwenden, um die Änderungen für Sie anzuwenden und zu entfernen, beispielsweise verwischen Sie die Konfigurationsdatei als Checkout von einem alternativen Zweig und bereinigen Sie die Konfigurationsdatei als Überprüfung von HEAD. Das ist kniffliges Zeug, ich empfehle es nicht für Anfänger.
  • Bewahren Sie die Konfigurationsdatei in einem dedizierten Bereitstellungszweig auf, der niemals mit dem Master zusammengeführt wird. Wenn Sie bereitstellen / kompilieren / testen möchten, werden Sie mit diesem Zweig zusammengeführt und erhalten diese Datei. Dies ist im Wesentlichen der Smudge / Clean-Ansatz mit Ausnahme der Verwendung von Merge-Richtlinien und Extra-Git-Modulen.
  • Anti-Empfehlung: Verwenden Sie nicht unverändert unverändert, es endet nur in Tränen.

.gitignore verhindert, dass nicht .gitignore Dateien (ohne add -f ) zu den von git .gitignore Dateien hinzugefügt werden. git wird jedoch weiterhin alle Dateien verfolgen, die bereits verfolgt werden.

Um das Verfolgen einer Datei zu beenden, müssen Sie sie aus dem Index entfernen. Dies kann mit diesem Befehl erreicht werden.

git rm --cached <file>

Das Entfernen der Datei aus der Kopfrevision erfolgt beim nächsten Commit.


git Update-Index macht den Job für mich:

git update-index --assume-unchanged <file>

Hinweis: Diese Lösung ist eigentlich unabhängig von .gitignore da gitignore nur für nicht protokollierte Dateien gilt.

Bearbeiten: Da diese Antwort veröffentlicht wurde, wurde eine neue Option erstellt, die bevorzugt werden sollte. Sie sollten --skip-worktree das für geänderte verfolgte Dateien gilt, die der Benutzer nicht mehr --assume-unchanged möchte, und sollte --assume-unchanged für die Leistung --assume-unchanged , um zu verhindern, dass git den Status großer verfolgter Dateien überprüft. Weitere Informationen finden Sie unter https://.com/a/13631525/717372


git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

Dadurch wird die Liste der ignorierten Dateien aus dem Index entfernt und die Änderungen übernommen.





git-rm