zurücksetzen Wie kann man Git „vergessen“, wenn eine Datei verfolgt wurde, die sich jetzt in.gitignore befindet?




git zeige commits (16)

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?


Im Falle eines bereits festgeschriebenen DS_Store :

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

Ignoriere sie durch:

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

Zum Schluss noch ein Commit!


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 .

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.

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.


Die Reihe der Befehle unten entfernt alle Elemente aus dem Git-Index (nicht aus dem Arbeitsverzeichnis oder dem lokalen Repo) und aktualisiert dann den Git-Index, wobei git ignore beachtet wird. PS. Index = Cache

Zuerst:

git rm -r --cached . 
git add .

Dann:

git commit -am "Remove ignored files"

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.


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


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

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


.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.


Ich habe dies mit git filter-branch erreicht . Der genaue Befehl, den ich verwendet habe, wurde von der Manpage übernommen:

WARNUNG : Dadurch wird die Datei aus Ihrem gesamten Verlauf gelöscht

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

Dieser Befehl erstellt die gesamte Festschreibungshistorie neu und führt git rm vor jedem Festschreiben aus. Dadurch wird die angegebene Datei gelöscht. Vergessen Sie nicht, es zu sichern, bevor Sie den Befehl ausführen, da er verloren geht.


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.


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" .


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.


Wenn Sie die CLI nicht verwenden möchten und unter Windows arbeiten, ist die Verwendung von TortoiseGit eine sehr einfache Lösung. In diesem Menü gibt es die Aktion "Delete (keep local)", die problemlos funktioniert.


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