gitignore ignoriert den Ordner nicht


134

Im Stammverzeichnis meines Projekts habe ich einen fooOrdner. Innerhalb des fooOrdners habe ich einen barOrdner. Ich möchte alle Änderungen an allen Dateien in meinem barOrdner ignorieren . Ich habe dies in meinem gitignore:

/foo/bar

Der Ordner wird überprüft: Er ist vorhanden und enthält die zu ignorierenden Dateien. gitignoreist committed. Ich habe jedoch eine Datei, in der ich eine Änderung vornehme und die sich in meinem barOrdner befindet. Wenn ich tippe

git status

In meinem git bashsehe ich die Datei, die hätte ignoriert werden sollen. Was könnte der Grund sein und wie kann ich alle Dateien in meinem Balkenordner erfolgreich ignorieren?

Beachten Sie, dass die Dateien zuvor mit derselben Zeile ignoriert wurden, ich diese Zeile jedoch vorübergehend zu commitetwas auf dem Server entfernen musste . Nach dem habe commitich die Leitung wieder in die gitignore. Dies war vor einer Weile, aber jetzt habe ich beobachtet, dass die Dateien in sein werden git status. Ich würde erwarten, die ignorierten Dateien ändern zu können, ohne dass sie in der erscheinen git status.


In Zukunft müssen Sie Ihre Ignorierungen nicht mehr ändern, um etwas Ignoriertes hinzuzufügen. git add -f ignored-filefügt eine Datei hinzu, auch wenn sie ignoriert wird.
Chris

Was gibt git status foo/bar/file-that-should-be-ignoredes?
Chris

Die Datei, die ignoriert werden sollte, wenn Änderungen vorgenommen wurden. Mir fehlt offensichtlich etwas, aber meines Wissens sollte die Liste des Git-Status in diesem Fall leer sein, vorausgesetzt, / foo / bar ist in .gitignore
Lajos Arpad am

4
Es hört sich so an, als würde diese Datei tatsächlich von Git verfolgt. Es muss irgendwann zum Repository hinzugefügt worden sein. Sie können seine Geschichte mit sehen git log foo/bar/file-that-should-be-ignored. Wenn es nicht Teil des Repositorys sein sollte, sollten Sie es mit entfernen git rm --cached foo/bar/file-that-should-be-ignoredund dann festschreiben, wie von Reck unten vorgeschlagen (obwohl ich es nur für die Datei tun würde, nicht für den gesamten Ordner). Dies wird (a) die Datei von Git entfernen, (b) die Datei in Ihrer lokalen Kopie behalten und (c) die Datei löschen, wenn andere fetchoder pulldas neue Commit.
Chris

Antworten:


337

Ich vermute, dieser Ordner wurde schon einmal in Git eingecheckt?

Führen Sie aus git rm -r --cached <folder>und überprüfen Sie erneut.


3
Dadurch wird der Ordner vollständig aus dem (aktuellen) Version des Repos entfernt. OP möchte, dass der Ordner dort ist, aber neue Änderungen sollten nicht nachverfolgt werden
Gareth

Leider muss ich die Annahme entfernen. Diese Lösung entfernte die Remote-Versionen der Dateien beim Push. Ich möchte gitignore so einrichten, dass alle Dateien eines Ordners ignoriert werden und nicht von der Remote entfernt werden. Ist das möglich? Ich habe die Lösung zurückgesetzt.
Lajos Arpad

11
git update-index --assume-unchanged <folder>vielleicht?
Reck

3
@Lajos hättest du nicht einfach seinen Fehler beheben sollen, anstatt diesen verwirrenden "Bearbeiten" -Kommentar dort hinzuzufügen?
Cregox

2
@Cawas, da es auf dieser Website um Wissensaustausch geht, lautet die Antwort: Nein. Es ist irreführend, eine Antwort zu akzeptieren, die einen Fehler enthält. Das -r ist nicht optional.
Lajos Arpad

45

Für mich war die akzeptierte Antwort Teil der Lösung, nicht die gesamte Lösung. Vielleicht waren die anderen Schritte, die ich veröffentlichen werde, offensichtlich, aber ich habe sie zuerst verpasst. Hier sind die Schritte, die ich unternommen habe, um sicherzustellen, dass meine .gitignoreDatei den Ordner ignoriert, den sie ignorieren soll:

  1. Übernehmen Sie alle Änderungen, die Sie korrigieren müssen.
  2. Führen Sie diesen Befehl aus: git rm -r --cached .(der alles aus dem Git-Index entfernt, um Ihr Git-Repository zu aktualisieren)
  3. Führen Sie dann diesen Befehl aus: git add .(um alles wieder zum Repo hinzuzufügen)
  4. Übernehmen Sie diese Änderungen schließlich mit git commit -m ".gitignore Fixed"

Den Link zu dem Artikel, in dem ich die Lösung gefunden habe, finden Sie hier .


1
Dies ist keine praktikable Lösung, die auf der ursprünglichen Frage basiert. @ lagos-arpad fragte speziell nach einem Unterverzeichnis und nicht nach dem gesamten Projekt. Ihre Lösung entfernt alles von der Stammebene des Git-Repositorys. Dies ist kein empfohlener Ansatz, um dieses Problem zu beheben.
Justinhartman

Auch wenn es sich nur um ein Unterverzeichnis handelt, hat diese Lösung für mich funktioniert, da ich nur mit einer Datei gearbeitet habe. Können Sie bitte erläutern, warum dies nicht empfohlen wird?
SikanderBabwani

1
Was Sie zu tun hatten, ist unerheblich. Dies ist nicht die Antwort auf die Frage und möglicherweise gefährlich, wie die andere Antwort gezeigt hat. Dadurch werden Inhalte auf dem Remote-Repo entfernt, die Sie nicht unbedingt benötigen.
RichieHH

8

Ich hatte dieses Problem und stellte fest, dass git die Dateien / Ordner tatsächlich korrekt ignorierte, aber mein Code-Editor (Visual Studio Code) war nur fehlerhaft und hat sie in der Seitenleiste der Benutzeroberfläche nicht richtig "ausgegraut". Ich habe VSCode neu gestartet und sie wurden wie erwartet ausgegraut.


Gleiches hier: VS Code v1.30.2 (Benutzer)
xinthose

Auch für mich. Vielen Dank für diese Lösung! Ich habe mich gefragt, warum mein .gitignore nicht funktioniert hat, bis ich versucht habe, VS Code neu zu starten. Ich bin in Visual Studio Code v1.44.2.
Fritz Lim

6

Als Ergänzung zur akzeptierten Antwort

git rm -r --cached /foo/bar/
git status

Wenn ich das mache, zeigt das Terminal eine Reihe von rmfor-Dateien in diesem Verzeichnis. Um ein weiteres Commit zu verhindern, das sich möglicherweise unnötig auf Remote auswirkt, habe ich Folgendes getan:

git reset HEAD *
git status

Danach sagte es nichts zu festschreiben und wenn ich Dateien darin ändere /foo/bar/und mache, git statusbekomme ich immer noch nothing to commit.


1
Dies bringt mich einfach
dorthin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.