540 Stimmen

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

Ich habe ein bestehendes Visual Studio-Projekt in meinem Repository. Ich habe kürzlich eine .gitignore-Datei unter meinem Projekt hinzugefügt und ich gehe davon aus, dass dies Git sagt, 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, die bereits verfolgt wurde, bevor eine Regel hinzugefügt wurde, um sie zu ignorieren, nicht ignorieren.

Es wurde vorgeschlagen, git rm --cached zu verwenden und sie manuell nicht mehr zu verfolgen, aber das würde ewig dauern, um sie einzeln durchzugehen.

Ich dachte darüber nach, das Repository zu löschen und neu zu erstellen, dieses Mal aber mit der .gitignore-Datei präsent, aber es muss einen besseren Weg geben, dies zu tun.

1409voto

Tohid Punkte 19167

Diese Antwort hat mein Problem gelöst:

Zuerst alle ausstehenden Änderungen committen.

Dann führen Sie diesen Befehl aus:

git rm -r --cached .

Dadurch wird alles aus dem Index entfernt, dann einfach ausführen:

git add .

Committen:

git commit -m ".gitignore funktioniert jetzt"

Bitte seien Sie vorsichtig, wenn Sie dies in ein Repository pushen und von irgendwo anders holen und in einem Zustand landen, wo diese Dateien noch verfolgt werden, werden die Dateien GELÖSCHT.

78voto

  1. Erstellen Sie eine .gitignore-Datei, um dies zu tun, erstellen Sie einfach eine beliebige leere .txt-Datei.

  2. Dann müssen Sie den Namen ändern, indem Sie die folgende Zeile im cmd eingeben (wobei git.txt der Name der gerade erstellten Datei ist):

umbenennen git.txt .gitignore

  1. Dann können Sie die Datei öffnen und alle unverfolgten Dateien schreiben, die Sie dauerhaft ignorieren möchten. Zum Beispiel sieht meine so aus:

    #OS-Junk-Dateien
    [Tt]humbs.db
    *.DS_Store
    
    #Visual Studio-Dateien
    *.[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*
    
    #Projektdateien
    [Bb]uild/
    
    #Subversion-Dateien
    .svn
    
    # Temporäre Office-Dateien
    ~$*

Es gibt eine ganze Sammlung nützlicher .gitignore-Dateien von GitHub

  1. Sobald Sie dies haben, müssen Sie es Ihrem Git-Repository hinzufügen, genau wie jede andere Datei, es muss jedoch im Stammverzeichnis des Repositorys liegen.

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

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

Aus der offiziellen Dokumentation:

Sie können auch eine globale .gitignore-Datei erstellen, die eine Liste von Regeln darstellt, um Dateien in jedem Git-Repository auf Ihrem Computer zu ignorieren. Zum Beispiel können Sie die Datei unter ~/.gitignore_global erstellen und einige Regeln hinzufügen.

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

Wenn das Repository bereits vorhanden ist, müssen Sie diese Befehle ausführen:

git rm -r --cached .
git add .
git commit -m ".gitignore funktioniert jetzt"

Wenn Schritt 2 nicht funktioniert, sollten Sie den vollständigen Pfad der Dateien angeben, die Sie hinzufügen möchten.

47voto

Wie hier angegeben können Sie den Index aktualisieren:

git update-index --assume-unchanged /Pfad/zur/Datei

Dadurch werden die Dateien nicht mehr in git status oder git diff angezeigt.

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

git update-index --no-assume-unchanged /Pfad/zur/Datei

46voto

Eli Nunez Punkte 469

Wenn Sie Ihre .gitignore zu spät hinzugefügt haben, wird git weiterhin bereits übertragene Dateien verfolgen. Um dies zu beheben, können Sie immer alle zwischengespeicherten Instanzen der unerwünschten Dateien entfernen.

Zuerst können Sie überprüfen, welche Dateien Sie tatsächlich verfolgen, indem Sie Folgendes ausführen:

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

Angenommen, Sie haben unerwünschte Dateien in einem Verzeichnis wie cache/ gefunden, ist es besser, dieses Verzeichnis anstelle aller Ihrer Dateien anzuvisieren.

Also anstatt:

git rm -r --cached .

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

git rm -r --cached cache/

Dann fahren Sie fort, alle Änderungen hinzuzufügen,

git add .

und zu committen...

git commit -m ".gitignore funktioniert jetzt"

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

2voto

Hier ist eine Möglichkeit, alle Dateien "unzuverfolgen", die anderenfalls unter dem aktuellen Satz von Ausschlussmustern ignoriert würden:

(GIT_INDEX_FILE=irgendeine-nichtexistent-datei \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Dies lässt die Dateien in Ihrem Arbeitsverzeichnis, entfernt sie jedoch aus dem Index.

Der Trick, der hier verwendet wird, besteht darin, git ls-files eine nicht-existenten Indexdatei bereitzustellen, damit es denkt, dass keine verfolgten Dateien existieren. Der obenstehende Shellcode fragt nach allen Dateien, die ignoriert würden, wenn der Index leer wäre, und entfernt sie dann aus dem tatsächlichen Index mit git rm.

Nachdem die Dateien "unverfolgt" sind, verwenden Sie git status, um zu überprüfen, ob nichts Wichtiges entfernt wurde (falls doch, passen Sie Ihre Ausschlussmuster an und verwenden Sie git reset -- Pfad, um den entfernten Indexeintrag wiederherzustellen). Machen Sie dann eine neue Commit, die das "überflüssige" ausschließt.

Das "überflüssige" wird immer noch in alten Commits vorhanden sein. Sie können git filter-branch verwenden, um saubere Versionen der alten Commits zu erstellen, wenn Sie wirklich eine saubere Historie benötigen (Hinweis: Die Verwendung von git filter-branch wird "History umschreiben", daher sollte sie nicht leichtsinnig durchgeführt werden, wenn Sie Collaborateure haben, die Ihre historischen Commits nach der Einführung des "überflüssigen" abgerufen haben).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X