2013-10-15 13 views
7

Wenn ich kompilieren meine C++ Projekt sind viele Shared Object-Dateien mit den Erweiterungen erstellt wieRegex artigen Schale glob Muster für gitignore

.so 
.so.0 
.so.7 
.so.0.7 

Ich brauche all denen meine .gitignore Datei hinzuzufügen. Wäre dies ein regulärer Ausdruck, konnte ich

\.so[\.0-9]* 

jedoch verwenden, sagt the documentation dass .gitignore

behandelt das Muster als Shell-Glob geeignet für den Verzehr durch fnmatch(3) mit der FNM_PATHNAME Flagge

I Ich habe mit den fnmatch Dokumentationen, die ich gefunden habe, keine Möglichkeit gefunden, das zu tun, was ich will. Gibt es wirklich keine Möglichkeit, dies zu tun?

+3

Verwenden Sie mehrere Zeilen:... '* .so'' * .so [0-9] '' * .so [0-9] [0-9] ' usw. Wenn Drehzahlen in zwei Ziffern gehen können, benötigen Sie noch mehr Glob-Muster.(hg hat 'syntax:' directives in seinem '.hgignore', so dass du regex und glob nach Belieben mischen kannst; vielleicht wird jemand irgendwann so etwas zu git hinzufügen.) – torek

+1

Allein die getrennte Installationshierarchie löst diese Art von Sache trotzdem . – jthill

+0

Von Interesse: https://github.com/git/git/commit/2e22a85e5c01d041434682fe75f58be94de0801b – VonC

Antwort

12

Während die Antwort von @SpeakEasy .so Dateien in einem einzigen Schritt *.so* mit ignorieren kann, für Ihren Anwendungsfall von Dateien in Formaten angegeben ignoriert, Sie zwei Einträge in Ihrem .gitignore für spezifischere Regel

ignorieren können
*.so 
*.so.[0-9]* 

Von gitignore man page

Jede Zeile in einem giti gnore-Datei gibt ein Muster an.

Git behandelt das Muster als Shell-Glob geeignet für den Verzehr durch fnmatch

Die wichtige Sache zu beachten ist, dass das Muster nicht die gleichen wie reguläre Ausdrücke ist.

Python hat ein Modul namens fnmatch, mit dem Sie überprüfen können, ob ein bestimmter Dateiname mit dem Muster übereinstimmt oder nicht.

Musterbeispiel:

import fnmatch 
pattern = "*.so.[0-9]*" 
filenames = ["a.so", "b.so.0", "b.so.11", "b.so.1.0", "b.so.1.0.12"] 

for filename in filenames: 
    print filename, fnmatch.fnmatch(filename, pattern) 

>>> a.so False 
    b.so.0 True 
    b.so.11 True 
    b.so.1.0 True 
    b.so.1.0.12 True 
+0

Das ist nicht genau dasselbe (obwohl es wahrscheinlich gut ist): zum Beispiel passt es 'a.so.' und' b.so ... 9'. – torek

+0

Ja, ich bin kein Experte, also weiß ich nicht, wem ich am meisten trauen sollte, aber ich glaube, @toreks Antwort ist sicherer und klarer. Sag mir, wenn ich falsch liege. –

+1

@mu 無 Alles, was mit '* .so. [0-9] *. [0-9] *' übereinstimmt, wird auch mit '* .so. [0-9] *' übereinstimmen, oder? Wie schreibe ich '* .so.someDigits.someDigits',' einigeDigits' sind nur 'beliebig viele Ziffern'? –

5

Funktioniert das Hinzufügen der Zeile *.so* nicht? Oder brauchen Sie mehr Feinkontrolle?

+2

Ich wollte bessere Kontrolle nur um sicher zu sein. Ich entdecke immer neue Erweiterungen. – roim

0

Von torek's comment:

Verwenden Sie mehrere Zeilen:

*.so 
*.so.[0-9] 
*.so.[0-9].[0-9] 

usw.

Ich weiß nicht, ob es einen besseren Weg ...

1

Ich denke, Sie können es in zwei Zeilen erreichen:

.so 
.so.[0-9]*