Stoppen Sie git, wenn Sie ignorierende Dateien ignorieren (Bug in git?)?

8

Ich habe einen Weg gefunden, dass git Sie nicht darum bittet, Ihre Dateien, die Sie für sicher halten, in .gitignore zu löschen, sondern stillschweigend zu löschen. Dies gilt auch, wenn Sie seit dem ersten Commit dieselbe Ignorierdatei hatten.

Das Problem tritt auf, wenn Sie sich in einem Commit befinden, bei dem eine genannte Datei entfernt, aber in .gitignore aufgelistet ist, und Sie dann einen anderen Commit auschecken, wo er existiert:

%Vor%

(Wechseln Sie in einen leeren Ordner, bevor Sie den obigen Code in das Terminal einfügen)

Gibt es überhaupt etwas, um diesen stillen Clobber zu verhindern?

    
sabgenton 10.07.2015, 16:35
quelle

1 Antwort

6

Es ist kein Bug (oder zumindest halten es die Entwickler nicht für einen Fehler).

Der Inhalt von .gitignore ist nicht "Dateien, die ignoriert werden sollen" oder "Pfadnamen, die nicht berührt werden sollen"; Stattdessen sind sie "Pfade, die nicht automatisch hinzugefügt werden und unterdrückt werden, dass sie als nicht verfolgt angezeigt werden" (was .gitignore zu einem schlechten Namen macht).

Sobald Sie eine Datei festgeschrieben oder sogar zum Index hinzugefügt haben, wird sie nicht länger ignoriert, unabhängig davon, ob sie in .gitignore aufgeführt ist.

Für einige Dateien können Sie git update-index --assume-unchanged oder (besser) git update-index --skip-worktree verwenden, aber im Allgemeinen, wenn Sie versehentlich eine Datei festgelegt haben, die Sie nicht haben sollten, und Sie wollen, dass sie ignoriert wird, müssen Sie "Geschichte neu schreiben" um es vollständig aus dem Repository zu holen, um gutes Verhalten zu erhalten. Das ist nicht zu schwierig, wenn Sie nichts gedrängt haben und wenige Commits haben, die die unerwünschte Datei enthalten, aber viel schwieriger, wenn Sie gedrängt haben, oder viele solcher Commits haben.

Siehe auch Git - Unterschied zwischen 'annehmen-unverändert' und 'überspringen-worktree' .

[Text unten Dezember 2016 hinzugefügt]

Technische Details

Für Git gibt es eine kurze, einfache und süße Definition einer verfolgten -Datei: Eine Datei wird genau dann verfolgt, wenn im Index ein Eintrag für sie vorhanden ist.

Die Dinge "annehmen, nicht geändert" und "worktree überspringen" sind Flags, die Sie manuell im Index setzen oder löschen können. Sie sind separate Flags und können individuell eingestellt werden, obwohl nicht klar ist, was es bedeutet, beide zu setzen. Die Absicht von "nehme an, dass sie unverändert ist" dient lediglich dazu, Git schneller zu machen, indem es annehmen akzeptiert, dass die Datei nicht geändert wird und daher nicht von% co_de aktualisiert werden muss %, während die Absicht des Flags "worktree überspringen" ist, Git "Hände weg" zu sagen: nicht nur annehmen es ist unverändert, versuchen Sie zu behalten unverändert. Das ist schwieriger als es auf den ersten Blick aussehen mag; Weitere Informationen hierzu finden Sie unter verknüpfter Post .

Um diese Flags setzen zu können, muss die Datei einen Indexeintrag haben, damit sie verfolgt werden muss.

Wenn eine Datei nicht verfolgt wird, wird sie möglicherweise auch ignoriert. Dafür gibt es zahlreiche Quellen: nicht nur die oberste Ebene git add , die eine Liste (eine pro Zeile) einer Variante von Git pathspec enthält, die auf Glob-Matching und -Negation beschränkt ist, sondern auch .gitignore Dateien innerhalb jedes Unterverzeichnisses innerhalb eines Repositorys, die Datei .gitignore falls vorhanden und die Datei mit dem Namen $GIT_DIR/info/exclude wenn dieser Konfigurationseintrag existiert. Um herauszufinden, ob und warum eine Datei ignoriert wird, verwenden Sie core.excludesFile , verfügbar seit Git Version 1.8.2. Die Option git check-ignore teilt Ihnen mit, welche Steuerdatei die Datei als ignoriert markiert hat.

Leider, wie in der Frage, auf die dies eine Antwort ist, hat "ignoriert" zwei Bedeutungen. Während der Abgleich eines Ignorierpfads Git ruhigstellt, dass die Datei nicht geparkt ist, macht es auch Git leicht, clobber die Datei zu benutzen.

    
torek 10.07.2015 19:05
quelle

Tags und Links