Warum ignoriert Git meine angegebene Datei nicht?


189

Ich habe die folgende Zeile hinzugefügt .gitignore:

sites/default/settings.php

aber wenn ich git statustippe, wird die Datei als nicht bereitgestellte Datei angezeigt.

Was ist das Problem? Alle anderen Muster funktionieren gut.



Ich hatte das gleiche Problem, dann stellte ich fest, dass ich meine .gitignore-Datei stattdessen auf einem anderen Laufwerk gespeichert hatte: face-palm:
Henry Chan

Es ist eine sehr schlechte Idee, Dinge in Ihrem Repository zu behalten und die Änderungen daran zu ignorieren.
Jewgenij Afanasjew

Antworten:


362

Stellen Sie sicher , dass Ihr .gitignorein der Wurzel des Arbeitsverzeichnis ist, und in diesem Verzeichnis laufen git statusund kopieren Sie den Pfad zur Datei aus dem Statusausgang und fügen Sie ihn in die.gitignore .

Wenn das nicht funktioniert, ist es wahrscheinlich, dass Ihre Datei bereits von Git verfolgt wird. Sie können dies durch die Ausgabe von bestätigen git status. Wenn die Datei nicht im Abschnitt "Nicht verfolgte Dateien" aufgeführt ist, wird sie bereits von Git verfolgt und ignoriert die Regel aus dem.gitignore Datei.

Der Grund, Dateien in Git zu ignorieren, besteht darin, dass sie nicht zum Repository hinzugefügt werden. Wenn Sie zuvor eine Datei hinzugefügt haben, die ignoriert werden soll, wird sie von Git verfolgt und die entsprechenden Übereinstimmungsregeln werden übersprungen. Git tut dies, da die Datei bereits Teil des Repositorys ist.

Um die Datei tatsächlich zu ignorieren, müssen Sie sie entfernen und aus dem Repository entfernen. Sie können dies mit verwenden git rm --cached sites/default/settings.php. Dadurch wird die Datei aus dem Repository entfernt, ohne die Datei physisch zu löschen (das ist, was das --cachedtut). Nach dem Festschreiben dieser Änderung wird die Datei aus dem Repository entfernt, und das Ignorieren sollte ordnungsgemäß funktionieren.


Was meinst du mit 'root des Arbeitsverzeichnisses'? Das Verzeichnis, in dem sich das '.git'-Repository befindet?
Jonathan Leffler

Das Arbeitsverzeichnis ist das Verzeichnis, in dem sich das .gitVerzeichnis befindet und das selbst das Stammverzeichnis des Repositorys ist. Wie , wenn Sie ein Repository klonen , um /xy/dann /xy/ist das Arbeitsverzeichnis mit nach /xy/.git/innen.
stupsen

3
Manchmal müssen Sie auch ein git add .After git rm --cachedausführen, um den Index ordnungsgemäß neu zu erstellen.
Cooper

Die Idee, es im Git-Status zu überprüfen, war brillant. Ich habe es im Git Staging in Eclipse immer wieder überprüft und der Pfad war falsch. Vielen Dank!
Walla

1
Ich musste das Flag -r (rekursiv) hinzufügen, da ich auch verschachtelte Ordner eingecheckt hatte. In meinem Fall bin ich in das Stammverzeichnis meines Git-Ordners verschoben und habe dann den Befehl git rm --cached -r .vs / Where vs ausgeführt, den Ordner der obersten Ebene, den ich aus dem Tracking entfernen wollte.
Devology Ltd

104

Ich stoße darauf, es ist eine alte Frage, aber ich möchte, dass diese Datei verfolgt wird, aber nicht auf bestimmten Arbeitskopien, damit Sie sie ausführen können

git update-index --assume-unchanged sites/default/settings.php

5
Das ist eigentlich die Antwort, nach der ich gesucht habe. Bei allen anderen Antworten wird davon ausgegangen, dass die Datei mit git add hinzugefügt wurde, was nicht immer der Fall ist. Bei Acquia Cloud soll die .gitignore-Datei die Datei settings.php (zum Beispiel) ignorieren, die Datei ist jedoch beim ersten Festschreiben enthalten. Wenn Sie die Datei nicht mehr verfolgen, löschen Sie sie einfach aus dem Repository und damit von der Live-Site ...
PatrickS

Hat mir auch geholfen - danke! Abgestimmt. Ich vermute, obwohl es nur für lokales Git-Repo gilt und nicht bestehen bleibt, wenn es einmal von anderen Entwicklern auf Remote geschoben und geklont wurde.
Ivan

1
Ja, es ist nur lokal.
Mescalito

40

.gitignore ignoriert nur Dateien, die Sie noch nicht zu Ihrem Repository hinzugefügt haben.

Wenn Sie a ausgeführt git add .haben und die Datei zum Index hinzugefügt wurde, hilft Ihnen .gitignore nicht weiter. Sie müssen es tun git rm sites/default/settings.php, um es zu entfernen, und dann wird es ignoriert.


Thanks.but Wie entferne ich die Datei nur aus dem Index und nicht aus dem Arbeitsverzeichnis?
Nick.h

1
git rmsollte dies tun, aber es kann sein, dass Sie aufgefordert werden, die Option -f zu verwenden, die es aus dem Arbeitsverzeichnis entfernen würde. Ich habe dies nur herausgefunden, um eine Kopie der Datei zu erstellen, die Kopie zu erstellen git rm -fund dann wiederherzustellen.
Jonescb

Selber Mann. Erstellen Sie irgendwo eine Kopie, entfernen Sie sie, übernehmen Sie den Status "Entfernen", fügen Sie die Dateien wieder hinzu und sehen Sie, wie sie jetzt ignoriert werden.
Jewgenij Afanasjew

14

Bitte benutzen Sie diesen Befehl

git rm -rf --cached .
git add .

Manchmal funktionieren Gitignore-Dateien nicht, obwohl sie korrekt sind. Der Grund, warum Git Dateien ignoriert, ist, dass sie nicht zum Repository hinzugefügt werden. Wenn Sie eine Datei hinzugefügt haben, die Sie zuvor ignorieren möchten, wird sie von Git verfolgt und alle überspringenden Übereinstimmungsregeln werden übersprungen. Git tut dies, weil die Datei bereits Teil des Repositorys ist.


12

Ich hatte das gleiche Problem. Dateien, die in definiert sind, .gitingorewerden beim Ausführen als nicht verfolgte Dateien aufgeführt git status.

Der Grund war, dass die .gitignoreDatei in UTF-16LECodierung und nicht in UTF8Codierung gespeichert wurde .

Nachdem ich die Kodierung der .gitignoreDatei geändert hatte, UTF8funktionierte sie für mich.


Ich fühle mich wie ein Noob aus diesem Grund ... verdammt noch mal Windows
Coty Embry

Irgendeine Idee, warum die Dateicodierung wichtig ist? Vielleicht nicht richtig lesen?
Chargnn

2

Was ich getan habe, um die Datei settings.php erfolgreich zu ignorieren :

  1. git rm --cached sites / default / settings.php
  2. Commit (bis hierher hat nicht funktioniert)
  3. manuell gelöschte sites / default / settings.php (das hat den Trick gemacht)
  4. git hinzufügen.
  5. Festschreiben (erfolgreich ignoriert)

Ich denke, wenn es die festgeschriebene Datei auf Git gibt, funktioniert Ignorieren nicht wie erwartet. Löschen Sie einfach die Datei und legen Sie fest. Danach wird es ignoriert.


2

Es gibt Instanzen, z. B. Anwendungskonfigurationsdateien, die in git verfolgt werden sollen (daher funktioniert .gitignore nicht), die ich jedoch für lokale Einstellungen ändern muss. Ich möchte nicht, dass Git diese Dateien verwaltet oder als geändert anzeigt. Dazu benutze ich skip-worktree:

git update-index --skip-worktree path/to/file

Sie können bestätigen, dass Dateien übersprungen werden, indem Sie Dateien auflisten und nach Zeilen suchen, die mit S beginnen, um übersprungen zu werden

git ls-files -v | grep ^S

Wenn Sie möchten, dass git die Datei in Zukunft erneut lokal verwaltet, führen Sie einfach Folgendes aus:

 git update-index --no-skip-worktree path/to/file

Mescalito oben hatte eine tolle Antwort, die mich aber auf den richtigen Weg führte

git update-index --assume-unveränderte Datei / to / ignore.php

Hat einen Vertrag mit git, in dem: der Benutzer verspricht, die Datei nicht zu ändern, und Git davon ausgehen kann, dass die Arbeitsbaumdatei mit den im Index aufgezeichneten übereinstimmt.

Ich ändere jedoch den Inhalt der Dateien, daher ist in meinem Fall --skip-worktree die bessere Option.

Die Website von Toshiharu Nishina bot eine hervorragende Erklärung für Skip-Worktree und Unverändert: Ignorieren Sie Dateien, die bereits lokal mit Git verwaltet wurden


2

Ein weiterer möglicher Grund - einige Instanzen von Git-Clients, die gleichzeitig ausgeführt werden . Zum Beispiel "Git Shell" + "GitHub Desktop" usw.


Dies ist mir passiert, ich habe "GitHub Desktop" als Hauptclient verwendet und einige neue .gitignore-Einstellungen ignoriert: Commit nach Commit:

  1. Sie begehen etwas.
  2. Als nächstes Commit: Es ignoriert die .gitignore-Einstellungen. Commit enthält viele temporäre Dateien, die im .gitignore erwähnt werden.
  3. Git-Cache löschen; Überprüfen Sie, ob .gitignore UTF8 ist. Dateien entfernen -> festschreiben -> Dateien zurück verschieben; 1 Commit überspringen - nichts hat geholfen.

Grund : Der Visual Studio Code-Editor wurde im Hintergrund mit demselben geöffneten Repository ausgeführt. VS Code verfügt über eine integrierte Git-Steuerung, was zu Konflikten führt.

Lösung : Überprüfen Sie mehrere versteckte Git-Clients und verwenden Sie nur einen Git-Client gleichzeitig, insbesondere beim Löschen des Git-Cache.


1

Stellen Sie sicher, dass der .gitignore keine Erweiterung hat !! Es kann nicht .gitignore.txt sein, in Windows benennen Sie einfach die Datei .gitignore. und es wird funktionieren.


0

Ich habe es gerade mit Git 1.7.3.1 versucht und eine Struktur wie folgt angegeben:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

Wo repoalso die oben erwähnte "Wurzel" ist (ich würde sie die Wurzel Ihres Arbeitsbaums nennen) und .gitignorenur enthält sites/default/settings.php, funktioniert das Ignorieren für mich (und es spielt keine Rolle, ob .gitignorees dem Repo hinzugefügt wird oder nicht). Passt das zu Ihrem Repo-Layout? Wenn nicht, was ist anders?


Ja. Es ist genau das gleiche wie bei Ihnen. Funktioniert jedoch nicht. Alle anderen Muster funktionieren. Wie ich bereits sagte, ist das Problem sicherlich relativ zum Ordner settings.php.
Nick.h

Ich halte es für eine sehr schlechte Idee, Dinge in Ihrem Repository zu behalten und die Änderungen daran zu ignorieren.
Jewgenij Afanasjew

@ YevgeniyAfanasyev mit Ausnahme von Dingen wie Kompilierungsausgabe, IDE-Benutzereinstellungen, allen anderen temporären Dateien, die von Ihrer Toolchain generiert wurden…
Chris F Carroll

Ich meinte, im Repository festgeschrieben zu bleiben, nicht nur Dateien, die sich im Projektordner befinden. Warum benötigen Sie temporäre Dateien im Repository?
Jewgenij Afanasjew

0

Nur für den Fall, dass jemand in Zukunft das gleiche Problem hat wie ich:

Wenn Sie die verwenden

*
!/**/
!*.*

Trick, um Binärdateien ohne Erweiterung zu entfernen, stellen Sie sicher, dass alle anderen Gitignore-Zeilen UNTEN sind. Git liest von oben aus .gitignore. Obwohl ich 'test.go' in meinem Gitignore hatte, war es zuerst in der Datei und wurde danach 'unignored'

!*.*

0

Ich habe die meisten Befehle oben auf dem VS Code-Terminal ausprobiert und dabei folgende Fehler erhalten:

fatal: pathspec '[dir]/[file]' did not match any files

Ich habe das Projekt auf GitHub Desktop geöffnet und von dort aus ignoriert und es hat funktioniert.

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.