Git-ignoriere bestimmte Dateien in Unterverzeichnissen, aber nicht alle

75

Ich habe eine ähnliche Struktur wie die folgende:

/root/
/root/data/
/root/data/script.php
/root/data/some.json
/root/data/feature/one.json
/root/data/feature/two.json
/root/data/other-feature/one.json
/root/data/other-feature/important-script.php

Ich möchte, dass git alle .json Dateien unter dem Pfad '/ data / ...' ignoriert , aber '/ data /' enthält manchmal Unterverzeichnisse.

Mein Verständnis ist, dass ein einfacher data/*.jsonin gitignore nur mit einem Verzeichnis übereinstimmt, da das *nicht übereinstimmt /, wie unter http://git-scm.com/docs/gitignore , "Pattern Format", Punkt 6 angegeben:

Andernfalls behandelt git das Muster als Shell-Glob, der für den Verbrauch durch fnmatch (3) mit dem Flag FNM_PATHNAME geeignet ist: Platzhalter im Muster stimmen nicht mit einem / im Pfadnamen überein. Beispielsweise stimmt "Documentation / *. Html" mit "Documentation / git.html" überein, nicht jedoch mit "Documentation / ppc / ppc.html" oder "tools / perf / Documentation / perf.html".

Gibt es eine einfache Möglichkeit, dies zu tun, oder muss ich Gitignore-Dateien in jedem Unterverzeichnis explizit aktiv hinzufügen?

anonymer Feigling
quelle
1
Die aktuellste Antwort finden Sie hier: stackoverflow.com/a/10714272/176877
Chris Moschini

Antworten:

94

Ich habe kürzlich einen Beitrag über ein solches Problem geschrieben. Siehe hier .

Grundsätzlich müssen Sie eine .gitignoremit *.jsonin das /data/Verzeichnis setzen.

UPD : Seit Git 1.8.4 ( 1.8.2, wenn Sie msysgit verwenden) ist es möglich, Doppelsternmuster wie zu verwenden/data/**/*.json

Ivan Danilov
quelle
Ich habe die .gitignoreDatei hinzugefügt , die enthält *.json, aber wenn ich eine dieser Dateien ändere und ausführe git status, werden sie als "Änderungen nicht bereitgestellt" aufgeführt. Müssen .gitignoreDateien festgeschrieben werden, bevor sie wirksam werden? Wird dies angezeigt, weil die Dateien zuvor verfolgt wurden?
anonymer Feigling
14
Zuvor verfolgte Dateien werden verfolgt, egal was .gitignore
drin
23

Sie können data/**/*.jsonin Ihr .gitignoreIn- /rootVerzeichnis legen , um zu verhindern, dass mehrere .gitignoreDateien in verschiedenen Verzeichnissen gespeichert werden

**/ - Entspricht einer beliebigen Anzahl von Unterverzeichnissen (einschließlich der aktuellen)

Beispiel: data/**/*.jsonDatensatz wird ignoriert data/1.json, data/subfolder/2.json,data/../../3.json

E. Monogarov
quelle
@CaptainBlammo Ich benutze es, es funktioniert, hast du vielleicht etwas falsch gemacht? Es gibt Infos: einige Dokumente
E. Monogarov
1
und es wird auch ignorieren /bla/data/**/*.jsonund /bla/bla/data/**/*.json. /data/**/*.jsonsollte benutzt werden.
Onur Demir
3

Dieses Muster funktioniert für mich für Datenunterordner, wobei nur PNG- und JPG-Dateien ignoriert werden:

**/data/**/*.png
**/data/**/*.jpg
Aqib Mumtaz
quelle