2013-05-21 13 views
8

Ich habe die folgende Ordnerstruktur:gitignore Verzeichnis Ausnahme nicht funktioniert

public 
    media 
     catalog 
      product 
      category 
     private 
     tmp 
     var 
     test 

Ich will alles im media Verzeichnis gitignore Ausnahme catalog/category und private

Mein gitignore ich versuche ist:

public/media/* 
!public/media/catalog/category/ 
!public/media/private 

Aber es funktioniert nicht. Alle neuen Dateien, die den Verzeichnissen category oder private hinzugefügt wurden, können nicht hinzugefügt werden.

Ich konnte einfach git Kraft hinzufügen, aber ich möchte dies durch die gitignore getan, wenn möglich

+0

die folgende Frage finden, die sehr ähnlich ist: http://stackoverflow.com/questions/7001126/git-ignore-all-except-subfolder – greydet

Antwort

7

Es ist in der Regel einfachsten nur .gitignore auf der Ebene zu bringen, wo es eine Rolle, beginnt. (Dies hilft auch, wenn Sie jemals ein Repository aufgeteilt oder Verzeichnisse bewegen.) In diesem Fall müssen Sie alles ignorieren außer catalog und private im public/media Ordner so in public/media/.gitignore put:

/* 
!/catalog/ 
!/private/ 

und in public/media/catalog/.gitignore Put:

/* 
!/category/ 

es ist wichtig (und der Grund dafür, dass Ihre Regeln funktionieren nicht) nicht das public/media/catalog Verzeichnis selbst, da sonst alles in ihr ignoriert werden, zu ignorieren, auch wenn Sie nicht ignorieren wollten sein einen bestimmten Teil Inhalt.

Natürlich können Sie diese zu einem einzigen kombinieren am public/media Ebene ignorieren, wenn Sie mögen:

/* 
!/catalog/ 
!/private/ 
/catalog/* 
!/catalog/category/ 
+0

Ok das funktioniert. Es ist ein bisschen ein Schmerz tatsächlich, da ich 1 schöne Gitignore hatte aber jetzt 3. Aber es funktioniert danke –

+0

@MartyWallace: Sie können eine einzelne '.gitignore' haben, wenn Sie bevorzugen (ich zählte nur 2 in meiner Antwort) Ich finde nur, dass die Muster komplexer werden. –

2

Lösung mit einem .gitignore auf Root-Ebene

Sie haben versucht, eine verwenden .gitignore Datei auf der Root-Ebene des Repositorys. Wie du, zentralisiere ich normalerweise auch alle Ignoranten, um die Dinge sauber zu halten. In diesem Fall ist es jedoch schwierig, weil "es nicht möglich ist, eine Datei wieder aufzunehmen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen ist" [source].

Meine hässliche Lösung für diese Einschränkung, die ich auch in meinen Antworten in Bezug erforschen here und here: Wieder beinhaltet alle übergeordneten Verzeichnisse auf dem Weg vor dem gewünschte Datei erneut einschließlich, während andere Dateien in diesen übergeordneten Verzeichnissen zu halten, indem sie wieder ausschließen.

Damit Ihre .gitignore Muster wäre:

public/media/** 
!public/media/private 
!public/media/catalog/ 

public/media/catalog/** 
!public/media/catalog/category/ 
Verwandte Themen