Ich versuche, ein Gitignore-Problem in einer großen Verzeichnisstruktur zu lösen, aber um meine Frage zu vereinfachen, habe ich es auf Folgendes reduziert.
Ich habe die folgende Verzeichnisstruktur von zwei Dateien (foo, bar) in einem brandneuen Git-Repository (bisher keine Commits):
a/b/c/foo
a/b/c/bar
Offensichtlich zeigt ein 'Git-Status -u':
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
Was ich tun möchte, ist eine .gitignore-Datei zu erstellen, die alles in a / b / c ignoriert, aber die Datei 'foo' nicht ignoriert.
Wenn ich einen .gitignore so erstelle:
c/
Dann zeigt ein 'git status -u' sowohl foo als auch bar als ignoriert an:
# Untracked files:
...
# .gitignore
Welches ist, wie ich erwarte.
Wenn ich nun eine Ausschlussregel für foo hinzufüge, also:
c/
!foo
Laut der gitignore-Manpage würde ich erwarten, dass dies funktioniert. Aber es tut es nicht - es ignoriert immer noch foo:
# Untracked files:
...
# .gitignore
Das funktioniert auch nicht:
c/
!a/b/c/foo
Dies gilt auch nicht:
c/*
!foo
Gibt:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
In diesem Fall wird der Balken, obwohl foo nicht mehr ignoriert wird, auch nicht ignoriert.
Die Reihenfolge der Regeln in .gitignore scheint ebenfalls keine Rolle zu spielen.
Dies macht auch nicht das, was ich erwarten würde:
a/b/c/
!a/b/c/foo
Dieser ignoriert sowohl Foo als auch Bar.
Eine Situation, die funktioniert, ist, wenn ich die Datei a / b / c / .gitignore erstelle und dort eingebe:
*
!foo
Das Problem dabei ist jedoch, dass es irgendwann andere Unterverzeichnisse unter a / b / c geben wird und ich nicht in jeden einzelnen einen separaten .gitignore einfügen möchte - ich hatte gehofft, einen 'projektbasierten' .gitignore zu erstellen Dateien, die sich im obersten Verzeichnis jedes Projekts befinden können und die gesamte Standardverzeichnisstruktur abdecken.
Dies scheint auch gleichwertig zu sein:
a/b/c/*
!a/b/c/foo
Dies mag der "Arbeit" am nächsten kommen, die ich erreichen kann, aber es müssen die vollständigen relativen Pfade und expliziten Ausnahmen angegeben werden, was sehr schmerzhaft sein wird, wenn ich viele Dateien mit dem Namen "foo" auf verschiedenen Ebenen habe des Unterverzeichnisbaums.
Entweder verstehe ich nicht ganz, wie Ausschlussregeln funktionieren, oder sie funktionieren überhaupt nicht, wenn Verzeichnisse (anstelle von Platzhaltern) ignoriert werden - durch eine Regel, die mit einem / endet
Kann jemand bitte etwas Licht ins Dunkel bringen?
Gibt es eine Möglichkeit, Gitignore dazu zu bringen, etwas Sinnvolles wie reguläre Ausdrücke anstelle dieser ungeschickten Shell-basierten Syntax zu verwenden?
Ich benutze und beobachte dies mit git-1.6.6.1 unter Cygwin / bash3 und git-1.7.1 unter Ubuntu / bash3.