Wenden Sie .gitignore auf ein vorhandenes Repository an, das bereits eine große Anzahl von Dateien verfolgt

313

Ich habe ein vorhandenes Visual Studio-Projekt in meinem Repository. Ich habe kürzlich eine .gitignore-Datei unter meinem Projekt hinzugefügt und gehe davon aus, dass Git angewiesen wird, die in der Datei aufgeführten Dateien zu ignorieren.

Mein Problem ist, dass all diese Dateien bereits verfolgt werden und soweit ich weiß, wird Git eine Datei nicht ignorieren, die bereits verfolgt wurde, bevor dieser Datei eine Regel hinzugefügt wurde, um sie zu ignorieren.

Es wurde vorgeschlagen, sie zu verwenden git rm --cachedund manuell zu entfernen, aber das wird ewig dauern, bis ich sie einzeln durchgesehen habe.

Ich habe darüber nachgedacht, das Repository zu löschen und erneut zu erstellen, diesmal jedoch mit vorhandener .gitignore-Datei, aber es muss einen besseren Weg geben, dies zu tun.

Um versteckte
quelle
1
Sie können git rm --cachedganze Verzeichnisse mit der -rOption, wenn das hilfreich ist
Nathan Wallace
Siehe auch: Untrack-Dateien von Git
Patrick James McDougle

Antworten:

868

Diese Antwort löste mein Problem:

Zunächst einmal begehen alle anstehenden Änderungen.

Führen Sie dann diesen Befehl aus:

git rm -r --cached .

Dadurch wird alles aus dem Index entfernt und dann einfach ausgeführt:

git add .

Verpflichte es:

git commit -m ".gitignore is now working"
Um versteckte
quelle
9
Perfekte Antwort ! Bitte fügen Sie auch ein hinzu git push origin, um die Änderungen im Remote-Repository widerzuspiegeln.
Sanket Berde
7
Ich habe angefangen, diese Antwort zu verwenden ... und sie hat fast alles in meinem Projekt gelöscht! Offensichtlich habe ich etwas falsch gemacht. Aber ich möchte die Leute warnen, diesem Vorschlag nicht beiläufig zu folgen.
Mark Olbert
4
Verliert dies den Verlauf der Dateien, wenn Sie sie entfernen und erneut hinzufügen
Aran Mulholland,
10
Ich frage mich, wie viele Commits diese .gitignore is now workingNachricht verwenden. :)
Ihavenoidea
1
Diese Methode hat bei mir gut funktioniert. Ich habe eine Gitignore-Datei erstellt, ein gesamtes Verzeichnis ignoriert und dann diese Änderung beim Erstellen des Gitignore vorgenommen. Ich habe dann diese drei Befehle genau so befolgt, wie sie es gesagt haben. Es hat perfekt funktioniert, aber ich sollte sagen, dass Sie zuerst "alle ausstehenden Änderungen festschreiben" müssen, wie oben angegeben.
Erich Meissner
61
  1. Erstellen Sie eine Gitignore-Datei. Dazu erstellen Sie einfach eine leere TXT-Datei.

  2. Dann müssen Sie den Namen ändern und die folgende Zeile in das cmd schreiben (wo git.txt ist der Name der Datei, die Sie gerade erstellt haben):

    rename git.txt .gitignore

  3. Dann können Sie die Datei öffnen und alle nicht verfolgten Dateien schreiben, die Sie endgültig ignorieren möchten. Zum Beispiel sieht meine so aus:

`` `

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Da ist ein ganze Sammlung nützlicher .gitignore-Dateien von GitHub

  1. Sobald Sie dies haben, müssen Sie es wie jede andere Datei zu Ihrem Git-Repository hinzufügen, nur muss es sich im Stammverzeichnis des Repositorys befinden.

  2. Dann müssen Sie in Ihrem Terminal die folgende Zeile schreiben:

    git config --global core.excludesfile ~ / .gitignore_global

Aus dem offiziellen Dokument:

Sie können auch eine globale Gitignore-Datei erstellen. Hierbei handelt es sich um eine Liste von Regeln zum Ignorieren von Dateien in jedem Git-Repository auf Ihrem Computer. Beispielsweise können Sie die Datei unter ~ / .gitignore_global erstellen und einige Regeln hinzufügen.

Terminal öffnen. Führen Sie den folgenden Befehl in Ihrem Terminal aus: git config --global core.excludesfile ~ / .gitignore_global

Wenn das Respository bereits vorhanden ist, müssen Sie die folgenden Befehle ausführen:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Wenn Schritt 2 nicht funktioniert, sollten Sie die gesamte Route der Dateien schreiben, die Sie hinzufügen möchten.

SomeAnonymousPerson
quelle
4
@Karen_Wiznia Die "Git-Konfiguration ... _global" erstellt einen globalen Gititingore für alle Git-Repos auf dem Computer. Das OP wollte das nicht.
ivan7707
Ich wünschte, ich könnte das mehr als einmal mögen, ich komme immer wieder auf diese Frage zurück und suche diese Erinnerung.
Antony D'Andrea
1
Es sollte "mv git.txt .gitignore" anstelle von "git.txt .gitignore umbenennen" sein.
Ahmad F
30

Wie hier angegeben Sie können den Index aktualisieren:

git update-index --assume-unchanged /path/to/file

Auf diese Weise werden die Dateien nicht in git statusoder angezeigt git diff.

Um die Dateien erneut zu verfolgen, können Sie Folgendes ausführen:

git update-index --no-assume-unchanged /path/to/file
Patrick James McDougle
quelle
5
Dies ist die bessere Antwort - sie konzentriert sich nur auf die einzelne Datei, die Datei, die nicht vom Repository verfolgt werden soll. Die am höchsten markierte Antwort funktioniert ebenfalls, bietet jedoch weit mehr als nur das Ignorieren einer Datei aus der Verfolgung durch Git.
Chris Mejka
1
Das ist ein guter. Aber was ist, wenn wir ziehen? Gibt es Zusammenführungskonflikte?
Pramod
@ Pramod, tolle Frage. Ich bin mir nicht wirklich sicher. Versuchen Sie es in einem abgespeckten Test-Repository?
Patrick James McDougle
14

Wenn Sie Ihre hinzugefügt haben .gitignore zu spät , verfolgt git unabhängig davon weiterhin festgeschriebene Dateien. Um dies zu beheben, können Sie jederzeit alle zwischengespeicherten Instanzen der unerwünschten Dateien entfernen.

Um zu überprüfen, welche Dateien Sie tatsächlich verfolgen, können Sie zunächst Folgendes ausführen:

git ls-tree --name-only --full-tree -r HEAD

Angenommen, Sie haben unerwünschte Dateien in einem solchen Verzeichnis gefunden cache/. Es ist sicherer, auf dieses Verzeichnis als auf alle Ihre Dateien zuzugreifen.

Also statt:

git rm -r --cached .

Es ist sicherer, auf die unerwünschte Datei oder das unerwünschte Verzeichnis abzuzielen:

git rm -r --cached cache/

Fügen Sie dann alle Änderungen hinzu.

git add .

und begehen ...

git commit -m ".gitignore is now working"

Referenz: https://amyetheredge.com/code/13.html

Eli Nunez
quelle
Dies ist die beste und sauberste Antwort, wenn Sie nur wenige Dateien entfernen möchten, nicht das gesamte Repository. Ich gebe dir meine Daumen hoch.
Apuig
2

Hier ist eine Möglichkeit, alle Dateien zu "entfernen", die ansonsten unter den aktuellen Ausschlussmustern ignoriert würden:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Dadurch bleiben die Dateien in Ihrem Arbeitsverzeichnis, werden jedoch aus dem Index entfernt.

Der hier verwendete Trick besteht darin, eine nicht vorhandene Indexdatei für Git-ls-Dateien bereitzustellen, sodass davon ausgegangen wird, dass keine verfolgten Dateien vorhanden sind. Der obige Shell-Code fragt nach allen Dateien, die ignoriert würden, wenn der Index leer wäre, und entfernt sie dann mit git rm aus dem tatsächlichen Index.

Nachdem die Dateien "nicht mehr verfolgt" wurden, überprüfen Sie mit dem Git-Status, ob nichts Wichtiges entfernt wurde (passen Sie in diesem Fall Ihre Ausschlussmuster an und verwenden Sie den Git-Reset-Pfad, um den entfernten Indexeintrag wiederherzustellen). Machen Sie dann ein neues Commit, das den „Rohstoff“ auslässt.

Der "Rohstoff" wird immer noch in alten Commits sein. Sie können git filter-branch verwenden, um saubere Versionen der alten Commits zu erstellen, wenn Sie wirklich einen sauberen Verlauf benötigen (nb, der git filter-branch verwendet, schreibt den Verlauf neu, daher sollte dies nicht leichtfertig durchgeführt werden, wenn Sie Mitarbeiter haben, die gezogen haben eine Ihrer historischen Verpflichtungen, nachdem der „Rohstoff“ zum ersten Mal eingeführt wurde).


quelle
klingt nach einer soliden Lösung :) Ich nehme an, dass dies für die Linux-Shell ist, oder? Leider bin ich ein Win7-Benutzer. Wie kann ich das in Windows machen?
Tohid
0

Entfernen Sie Dateien aus dem Staging-Bereich

git reset HEAD .

Fügen Sie alle Änderungen hinzu

git add .

Verpflichte es:

git commit -m ".gitignore is now working"
Mahdi Ben Selimene
quelle
-1

Ich denke, dies ist eine einfache Möglichkeit, eine .gitignore- Datei zu einem vorhandenen Repository hinzuzufügen .

Voraussetzung :

Sie benötigen einen Browser, um auf Ihr Github-Konto zuzugreifen.

Schritte

  1. Erstellen Sie eine neue Datei in Ihrem gewünschten (vorhandenen) Projekt und nennen Sie sie .gitignore . Sie erhalten eine suggestive Eingabeaufforderung für .gitignore-Vorlagen, sobald Sie die Datei als .gitignore benennen . Verwenden Sie entweder diese Vorlagen oder gitignore.io , um den Inhalt Ihrer gitignore- Datei zu generieren .
  2. Übernehmen Sie die Änderungen.
  3. Klonen Sie nun dieses Repository.

Habe Spaß!

Roshan Poudyal
quelle
-3

Verwenden git clean
Sie Hilfe zum Ausführen

git clean -h

Wenn Sie sehen möchten, was zuerst passieren würde, müssen Sie den Schalter -n für einen Trockenlauf übergeben:

git clean -xn

So entfernen Sie gitingnored Müll

git clean -xdf

Achtung: Möglicherweise ignorieren Sie lokale Konfigurationsdateien wie database.yml, die ebenfalls entfernt würden. Benutzung auf eigene Gefahr.

Dann

git add .
git commit -m ".gitignore is now working"
git push
Nedudi
quelle