Wie kann ich Git "vergessen", wenn eine Datei verfolgt wurde, die sich aber jetzt in .gitignore befindet?

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

Diese Datei wird jedoch nach der Bearbeitung weiterhin im git status angezeigt. Wie lässt du git ganz vergessen?

4082
13 авг. Set Ivan 13 Aug. 2009-08-13 22:23 09 um 10:23 Uhr 2009-08-13 22:23
@ 22 Antworten

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

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

 git rm --cached <file> 

Das Löschen einer Datei aus dem Revisionsheader erfolgt beim nächsten Commit.

HINWEIS: Obwohl die physische Datei dadurch nicht aus Ihrer lokalen Datei entfernt wird, werden beim nächsten git pull Dateien von den Computern anderer Entwickler gelöscht.

4329
13 авг. Antwort von CB Bailey 13. August 2009-08-13 23:40 09 um 23:40 Uhr 2009-08-13 23:40 Uhr

In der folgenden Befehlsfolge werden alle Elemente aus dem Git-Index gelöscht (nicht aus dem Arbeitsverzeichnis oder aus dem lokalen Repo). Anschließend wird der Git-Index aktualisiert, während Git ignoriert wird. Ps. Index = Cache

Erstens:

 git rm -r --cached . git add . 
border=0

Dann:

 git commit -am "Remove ignored files" 
2209
30 сент. Die Antwort wird von Matt Frear 30 Sep gegeben . 2013-09-30 16:51 '13 um 16:51 2013-09-30 16:51

git Update-Index erledigt die ganze Arbeit für mich:

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

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

change: seit der Veröffentlichung dieser Antwort wurde eine neue Option erstellt, die bevorzugt werden sollte. Sie sollten --skip-worktree das für geänderte überwachte Dateien gedacht ist, die der Benutzer nicht mehr --assume-unchanged möchte, und speichert --assume-unchanged für eine bessere Leistung, so dass git den Status großer überwachter Dateien nicht überprüft. Weitere Informationen finden Sie unter spravaw.site.site/questions/1817 / ...

 git update-index --skip-worktree <file> 
830
27 нояб. Die Antwort wird Konstantin am 27. November gegeben. 2013-11-27 14:24 '13 am 14:24 2013-11-27 14:24
 git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached git commit -am "Remove ignored files" 

Dies nimmt eine Liste der ignorierten Dateien und entfernt sie aus dem Index. Anschließend werden die Änderungen festgeschrieben.

237
24 мая '14 в 1:29 2014-05-24 01:29 Die Antwort wird am 24. Mai 14 um 01:29 Uhr 2014-05-24 01:29 gegeben

Ich verwende diesen Befehl immer zum Löschen dieser nicht abspielbaren 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, ersetzt durch eine Zeile mit Anführungszeichen anstelle von jeder Zeile der Ausgabe, um Pfade mit Leerzeichen zu verarbeiten und alles an git rm -r --cached zu übergeben, um die Pfade / Dateien / Verzeichnisse aus dem Index zu entfernen.

62
19 июня '15 в 18:42 2015-06-19 18:42 Die Antwort wurde von David Hernandez am 19. Juni 15 um 18:42 Uhr 2015-06-19 18:42 gegeben

Wenn Sie git rm überwachte Datei nicht git rm können, weil andere Personen sie möglicherweise benötigen (eine Warnung, auch wenn Sie git rm --cached wenn eine andere Person diese Änderung erhält, werden ihre Dateien in ihrem Dateisystem gelöscht). Dies wird häufig aufgrund des Überschreibens der Konfigurationsdatei, der Anmeldeinformationen für die Authentifizierung usw. durchgeführt. Unter https://gist.github.com/1423106 erfahren Sie, auf welche Weise Menschen das Problem umgangen haben.

Zusammenfassend:

  • Bitten Sie Ihre Anwendung, die fehlende Datei config-overide.ini zu finden, und verwenden Sie sie für die erfasste Datei config.ini (oder suchen Sie alternativ nach ~ / .config / myapp.ini oder $ MYCONFIGFILE).
  • Korrigieren Sie die Datei config-sample.ini und ignorieren Sie die Datei config.ini. Erstellen Sie ggf. ein Skript oder eine ähnliche zu kopierende Datei.
  • Verwenden Sie die gitattributes clean / smudge magic zum Anwenden und Entfernen von Änderungen. Verwischen Sie beispielsweise die Konfigurationsdatei als Extrakt aus einem alternativen Zweig und löschen Sie die Konfigurationsdatei als Extrakt aus HEAD. Dies ist eine schwierige Sache, ich empfehle es nicht für Anfänger.
  • Speichern Sie die Konfigurationsdatei in ihrem dedizierten Implementierungszweig, der niemals mit master zusammengeführt wird. Wenn Sie bereitstellen / kompilieren / testen möchten, werden Sie mit diesem Zweig zusammengeführt und erhalten diese Datei. Im Wesentlichen handelt es sich hierbei um den Smudge / Clean-Ansatz, mit Ausnahme der Verwendung von Merge-Policies und zusätzlichen Git-Modulen.
  • Anti-Empfehlungsempfehlung: Verwenden Sie keine Annahmen ohne Änderungen, es endet nur mit Tränen (da eine falsche Lüge an sich zu schlechten Dingen führen kann, z. B. dass Ihre Änderungen für immer verloren gehen).
53
19 июля '12 в 3:08 2012-07-19 03:08 Die Antwort wird von Seth Robertson am 19. Juli 12 um 03:08 2012-07-19 03:08 gegeben

Verschiebe es, sperre es und schicke es zurück. Es hat in der Vergangenheit für mich funktioniert. Es gibt wahrscheinlich eine Möglichkeit für Gittier, dies zu tun.

51
13 авг. Antwort von Joel Hooks 13. August 2009-08-13 22:27 09 um 22:27 Uhr 2009-08-13 22:27

Verwenden Sie dies, wenn:

1. Sie möchten viele Dateien formatieren 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 / übertragen und diese dann zu Ihrem.gitignore hinzugefügt. 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 werden, einschließlich der .gitignore-Datei.

Schritt 2. Entfernen Sie alles aus dem Repository.

Um Ihr Repo zu löschen, verwenden Sie:

 git rm -r --cached . 
  • rm - Befehl löschen
  • -r erlaubt das rekursive Löschen
  • -Cached entfernt nur Dateien aus dem Index. Ihre Dateien werden immer noch da sein.

Der Befehl rm kann unerbittlich sein. Wenn Sie vorab versuchen möchten, was es macht, fügen Sie -n oder --dry-run , um alles zu überprüfen.

Schritt 3: Alles hinzufügen

 git add . 

Schritt 4: Fix

 git commit -m ".gitignore fix" 

Dein Repository ist sauber :)

Klicken Sie auf die Änderungen auf der Fernbedienung, um die Änderungen zu sehen, die auch dort wirksam sind.

40
22 апр. Antwort von Dheeraj Bhaskar am 22. April 2018-04-22 21:11 '18 um 21:11 Uhr 2018-04-22 21:11

Was für mich nicht funktioniert hat

(Unter Linux) Ich wollte Nachrichten verwenden, die den ls-files --ignored --exclude-standard | xargs git rm -r --cached der ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached . In einigen der zu löschenden Dateien waren jedoch Zeilenumbrüche / LF / \n Zeichen eingebettet. 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 

Behandeln Sie diese Situation (erhalten Sie Fehler über nicht gefundene Dateien).

Deshalb schlage ich vor

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

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

Die Handbuchseite git-ws-files (1) besagt:

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

Ich denke, meine Lösung ist notwendig, wenn die Dateinamen eines dieser Zeichen enthalten.

BEARBEITEN: Ich wurde gebeten, das hinzuzufügen - wie bei jedem Befehl von git rm -, muss zum Beispiel ein Commit ausgeführt werden , um die Entfernung dauerhaft zu machen. git commit -am "Remove ignored files" .

38
29 дек. Die Antwort wird von JonBrave am 29. Dezember gegeben. 2015-12-29 15:50 '16 am 15:50 2015-12-29 15:50

Ich tat dies mit dem Git-Zweig des Filters . Der genaue Befehl, den ich verwendet habe, wurde von der Manpage übernommen:

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

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

Dieser Befehl erstellt die gesamte Commit-Historie neu, indem git rm vor jedem Commit ausgeführt wird und die angegebene Datei somit entfernt wird. Denken Sie daran, vor dem Ausführen des Befehls ein Backup durchzuführen, da es verloren geht.

35
13 авг. die antwort wird mit drrlvn 13 aug gegeben. 2009-08-13 22:35 09 um 10:35 Uhr 2009-08-13 22:35 Uhr
  • Aktualisieren Sie die .gitignore Datei. .gitignore beispielsweise einen Ordner hinzu, in dem Sie .gitignore nicht verfolgen .gitignore .

  • git rm -r --cached . - löschen Sie alle verfolgten Dateien, einschließlich unerwünschter und unerwünschter Dateien. Ihr Code ist sicher, wenn Sie ihn lokal speichern.

  • git add . - Alle Dateien werden mit Ausnahme der in .gitignore angegebenen Dateien wieder hinzugefügt.


Tipp @AkiraYamamoto muss in die richtige Richtung zeigen.

18
04 апр. Die Antwort ist gegeben Chen_Wayne 04 April. 2016-04-04 07:09 '16 am 7:09 2016-04-04 07:09

Ich denke, dass git die Datei aufgrund ihres Konzepts ( den Abschnitt "Images, nicht den Unterschied" ) möglicherweise nicht vollständig vergessen kann.

Dieses Problem fehlt beispielsweise bei der Verwendung von CVS. CVS speichert Informationen als dateibasierte Änderungsliste. Informationen für CVS sind eine Sammlung von Dateien und Änderungen, die im Laufe der Zeit an jeder Datei vorgenommen wurden.

In git wird jedoch jedes Mal, wenn Sie den Status Ihres Projekts festlegen oder speichern, im Wesentlichen ein Bild davon erstellt, wie alle Ihre Dateien im Moment aussehen, und ein Link zu diesem Snapshot gespeichert. Wenn Sie also eine Datei einmal hinzugefügt haben, ist dies immer der Fall wird in diesem Snapshot vorhanden sein.

Diese 2 Artikel waren hilfreich für mich:

git voraussetzen-keine Änderung vs überspring-worktree und Ignorieren von Änderungen in verfolgten Dateien mit git

Auf dieser Grundlage mache ich Folgendes, wenn die Datei bereits verfolgt wurde:

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

Ab diesem Zeitpunkt werden alle lokalen Änderungen in dieser Datei ignoriert und nicht gelöscht. Wenn die Datei in eine Remote-Datei geändert wird, tritt ein Konflikt auf, wenn git pull . Stop wird nicht funktionieren. Kopieren Sie den Inhalt der Datei an einen sicheren Ort, und führen Sie die folgenden Schritte aus, um das Problem zu lösen:

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

Der Inhalt der Datei wird durch den gelöschten Inhalt ersetzt. Fügen Sie die Änderungen an einem sicheren Ort in die Datei ein und führen Sie sie erneut aus:

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

Wenn jeder, der mit dem Projekt arbeitet, git update-index --skip-worktree <file> , sollte es mit pull keine Probleme geben. Diese Lösung eignet sich für Konfigurationsdateien, wenn jeder Entwickler über eine eigene Projektkonfiguration verfügt.

Dies ist nicht besonders praktisch, wenn eine Datei auf einem Remotecomputer geändert wurde. Sie kann jedoch verhindern, dass sie durch Remoteinhalte überschrieben wird.

12
21 мая '17 в 18:12 2017-05-21 18:12 Die Antwort wird gegeben Boolean_Type 21. Mai '17 um 6:12 2017-05-05 18:12

Antwort kopieren / git rm --cached -r.; git add.; git status : git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status

Dieser Befehl ignoriert Dateien, die bereits in das Git-Repository übertragen wurden. Jetzt haben wir sie zu .gitignore hinzugefügt.

5
19 нояб. Die Antwort wird von Youhans 19. November gegeben 2018-11-19 14:21 '18 um 14:21 Uhr 2018-11-19 14:21 Uhr

Die Antwort von Matt Fear war der effektivste IMHO. Das Folgende ist nur ein PowerShell-Skript für diejenigen, die nur unter Windows Dateien aus ihrem git-Repository löschen, was ihrer Ausnahmeliste entspricht.

 # 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 . 
5
25 дек. Die Antwort wird von Ameer Deen am 25. Dezember gegeben. 2013-12-25 03:51 '13 am 3:51 2013-12-25 03:51

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

5
13 авг. Antwort von Apreche 13. August 2009-08-13 22:27 09 um 22:27 Uhr 2009-08-13 22:27

Führen Sie die folgenden Schritte abwechselnd aus. Alles wird gut.

1. Löschen Sie falsch hinzugefügte Dateien aus dem Verzeichnis / Repository . Sie können den Befehl "rm -r" (für Linux) verwenden oder durch Durchsuchen der Verzeichnisse löschen.

2. Fügen Sie Dateien / Verzeichnisse in die gitignore Datei ein und speichern Sie sie.

3. Löschen Sie sie nun mit diesen Befehlen aus dem git-Cache (wenn es mehrere Verzeichnisse gibt, löschen Sie sie nacheinander, und geben Sie diesen Befehl erneut ab).

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

4. Jetzt bestätigen Sie und drücken Sie , verwenden Sie diese Befehle. Dadurch werden diese Dateien aus dem Remote-Git entfernt und git hört auf, diese Dateien zu verfolgen.

 git add . git commit -m "removed unnecessary files from git" git push origin 
3
20 сент. Die Antwort wird von Shamsul Arefin Sajib 20 Sep. gegeben. 2018-09-20 13:52 '18 um 13:52 Uhr 2018-09-20 13:52 Uhr

BFG wurde speziell entwickelt, um unerwünschte Daten, z. B. große Dateien oder Passwörter, aus den Git-Repositorys zu entfernen. Daher gibt es ein einfaches Flag, mit dem große historische Dateien (nicht in Ihren aktuellen Dateien) entfernt werden: "-strip-blobs-more-than"

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

Wenn Sie Dateien anhand ihres Namens angeben möchten, können Sie auch Folgendes tun:

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

BFG ist 10-1000-mal schneller als der Git-Filterzweig und in der Regel einfacher zu verwenden. Weitere Informationen finden Sie in den Anweisungen zur vollständigen Verwendung und in den Beispielen .

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

3
03 сент. Antwort von Meir Gerenstadt 03 Sep. 2017-09-03 15:37 '17 um 15:37 Uhr 2017-09-03 15:37

Ich mochte die Antwort von JonBrave, aber ich habe ziemlich schmutzige Arbeitsverzeichnisse, die fixieren -a, es macht mir ein bisschen Angst, also tat ich es:

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 ignorierte Dateien aus dem Index entfernen"

Zerstörung:

 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
  • Stage.gitignore und die Dateien, die Sie gerade gelöscht haben.
  • begehen
2
08 авг. die antwort wird von jay irvine 08 aug gegeben. 2018-08-08 23:49 '18 um 11:49 PM 2018-08-08 23:49

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

2
15 марта '18 в 14:04 2018-03-15 14:04 Die Antwort wird von Pedi T. gegeben . 15. März '18 um 14:04 Uhr 2018-03-15 14:04

Dies ist in der neuesten Version von git (v2.17.1 zum Zeitpunkt des Schreibens) kein Problem mehr .

In .gitignore verfolgte Dateien ignoriert, aber gelöscht. Sie können dies selbst überprüfen, indem Sie das folgende Skript ausführen. Der finale git status Ausdruck sollte "nichts tun" sagen.

 # Create empty repo mkdir gitignore-test cd gitignore-test git init # Create a file and commit it echo "hello" > file git add file git commit -m initial # Add the file to gitignore and commit echo "file" > .gitignore git add .gitignore git commit -m gitignore # Remove the file and commit git rm file git commit -m "removed file" # Reintroduce the file and check status. # .gitignore is now respected - status reports "nothing to commit". echo "hello" > file git status 
1
13 июня '18 в 19:21 2018-06-13 19:21 Antwort wurde von Lloyd am 13. Juni 1818 um 19:21 Uhr 2018-06-13 19:21 gegeben

Im Falle eines bereits festgeschriebenen DS_Store :

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

Ignoriere sie:

 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 einen Fix!

0
23 апр. die antwort wird von user7718859 23 apr. 2018-04-23 00:14 18 um 0:14 2018-04-23 00:14

Auf dem mac:

 $ git --version git version 2.6.4 $ uname -a Darwin MUSRV186016-382 14.5.0 Darwin Kernel Version 14.5.0: Sun Sep 25 22:07:15 PDT 2016; root:xnu-2782.50.9~1/RELEASE_X86_64 x86_64 

1. Löschen Sie die DS_Store-Dateien aus der Liste der Dateien, die von git im Zweig foo verfolgt werden:

 $ for file in $(git ls-tree -r foo --name-only | grep -i DS_Store); do git rm --cached $file; done 

2. Commit:

 $ git commit -m "Removed .DS_Store files" 

3. Stellen Sie sicher, dass die Dateien nicht mehr verfolgt werden.

 $ git ls-tree -r foo --name-only # There should not be anything coming back 

4. Klicken Sie auf, um sie von der Konsole zu entfernen:

 $ git push 
-5
13 янв. Antwort von Raphvanns 13. Januar 2017-01-13 22:53 '17 am 10:53 2017-01-13 22:53

Weitere Fragen zu den Tags oder Ask a Question