Whitelisting und Unterverzeichnisse in Git

90

Ich habe eine Whitelist nur für Textdateien erstellt.

*
!*.txt

Jetzt habe ich eine nicht verfolgte Textdatei in einem Unterverzeichnis - sub/dir/file.txtund diese wird NICHT angezeigt (sie wird ignoriert). Textdateien im Stammverzeichnis werden jedoch angezeigt.

Warum ist das so und wie behebe ich es?

Nate
quelle
1
Siehe auch
Johnsyweb
Sind die Dateien, die Sie in ein Unterverzeichnis aufnehmen möchten? In diesem Fall wird dieses Unterverzeichnis möglicherweise bereits vom ersten Stern in Ihrem ignoriert .gitignore.
Fajran
Ja. Diese Dateien sind in der Verzeichnisstruktur so niedrig wie der Ordner 11.1.102.55 in meinem Beispiel. Die Verschachtelung ist zwischen Ordnern / Produkten nicht immer gleich.
Nate
1
Ich kenne diese Funktionalität. Wir haben Hunderte von Verzeichnissen. Es wäre schneller, die Dateitypen, die wir nicht möchten, explizit zu ignorieren, als einen Gitignore für jedes Verzeichnis zu erstellen. Ich bin wirklich auf der Suche nach einer Möglichkeit, die Whitelist-Funktionalität aus der .gitignore-Datei herauszuholen.
Nate
1
Ich sehe nicht, wie das ein Duplikat ist. In der anderen Frage wird gefragt, wie bestimmte Dateien auf die Whitelist gesetzt werden sollen, während in dieser Frage gefragt wird, wie bestimmte Dateitypen einschließlich Unterordnern auf die Whitelist gesetzt werden sollen. Eigentlich ist es eher ein Duplikat von stackoverflow.com/questions/8024924/… .
Big McLargeHuge

Antworten:

142

Wenn Sie es auf diese Weise versuchen, schlägt dies fehl, da Sie am Ende die Verzeichnisse in Ihrer Struktur auf die schwarze Liste setzen.

Um dies zu lösen, möchten Sie alles auf die schwarze Liste setzen, was kein Verzeichnis ist und nicht zu den Dateitypen gehört, die Sie festschreiben möchten, ohne Verzeichnisse auf die schwarze Liste zu setzen .

Die .gitignoreDatei, die dies tun wird:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

Getestet dies in einer dreistufigen Struktur Whitelisting für .txtDateien in Gegenwart *.one, *.twound *.threeDateien unter Verwendung eines .gitignoresich im Stammverzeichnis der Repository - Werke für mich. Sie müssen nicht .gitignoreallen Verzeichnissen in Ihrer Struktur Dateien hinzufügen .

Informationen, mit denen ich die Antwort herausgefunden habe, stammen unter anderem von diesem (stackoverflow.com).

simont
quelle
18
Sie brauchen auch den Eintrag !.gitignore, wenn Sie verwenden *, nicht wahr?
Sjas
2
Siehe meine Antwort hier: stackoverflow.com/questions/987142/… Es kann sinnvoller sein, /*nur den Ordner der obersten Ebene auf die schwarze Liste zu setzen , aber nicht alle Ordner rekursiv, was eigentlich bedeutet, .gitignoredass die Unterordner eines Ordners nicht in die Whitelist aufgenommen werden sollten.
Ryan Taylor
1

Ein einfacher Weg, dies zu erreichen, ist:

# Blacklist all files...
*.*

# ...except the ones we want
!*.txt

Dies funktioniert, weil gitignoreMuster angewendet werden, die nicht /auf jeder Ebene unterhalb der .gitignoreDatei beginnen:

Wenn sich am Anfang oder in der Mitte (oder in beiden) des Musters ein Trennzeichen befindet, ist das Muster relativ zur Verzeichnisebene der jeweiligen Gitignore-Datei. Andernfalls kann das Muster auch auf jeder Ebene unterhalb der Gitignore-Ebene übereinstimmen.

Wenn Sie dies für Dateien in einem Verzeichnis tun möchten , werden die Dinge komplexer:

# Blacklist all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

Dies funktioniert, weil gitignorespezielle Regeln für **:

Zwei aufeinanderfolgende Sternchen (" **") in Mustern, die mit dem vollständigen Pfadnamen übereinstimmen, können eine besondere Bedeutung haben:

  • Ein Schrägstrich gefolgt von zwei aufeinanderfolgenden Sternchen, dann entspricht ein Schrägstrich null oder mehr Verzeichnissen. Zum Beispiel " a/**/b" entspricht " a/b", " a/x/b", " a/x/y/b" und so weiter.

Das Schlüsselelement ist, sicherzustellen, dass Sie Verzeichnisse nicht ignorieren, da dann jede Datei in diesem Verzeichnis unabhängig von anderen Regeln ignoriert wird.

Sharadh
quelle
0

Ich habe lange gesucht:

  1. Angenommen, ich habe eine große Ordnerstruktur mit ~ 100.000 rekursiv verschachtelten Verzeichnissen. In diesen Ordnern befinden sich ungefähr 30.000 Dateien vom Typ .txt(in meinem Fall: Typ *.md). Neben diesen *.mdDateien befinden sich beispielsweise 500 GB (über eine Million) Dateien, die ich nicht verfolgen möchte.

  2. Ich möchte, dass git nur .txt(oder *.md) Dateien in allen Ordnern und Unterverzeichnissen verfolgt.

Die richtige Antwort sollte lauten: Dies ist in Git nicht möglich.

Was ich stattdessen getan habe:

[edit: hat auch nicht funktioniert - Ich habe versucht, einen Ordner mit Symlinks (oder Hardlinks) zu erstellen und dort git zu verwenden, aber git folgt keinen Symlinks und überschreibt Hardlinks. Doh!]

Alex
quelle