Regex-like shell glob patterns for gitignore

后端 未结 5 816
温柔的废话
温柔的废话 2020-12-19 03:00

When I compile my C++ project, many shared object files are created with extensions such as

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

I need to add all those

相关标签:
5条回答
  • 2020-12-19 03:35

    Python has a module named fnmatch, you can use that to verify whether a particular filename matches the pattern or not.

    Not exactly correct like @mu 無 said.

    https://git-scm.com/docs/gitignore

    For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c".

    But I tried in fnmatch:

    >>> p = "/*.c"
    >>> f = "cat-file.c"
    >>> fnmatch(f, p)
    False
    >>> f2 = "abc/def/cat-file.c"
    >>> fnmatch(f2, p)
    False
    >>> p2 = "*.c"
    >>> fnmatch(f, p2)
    True
    >>> fnmatch(f2, p2)
    True
    

    fnmatch not match cat-file.c but .gitignore support.

    0 讨论(0)
  • 2020-12-19 03:39

    I think you can accomplish it in two lines:

    .so
    .so.[0-9]*
    
    0 讨论(0)
  • 2020-12-19 03:42

    From torek's comment:

    Use multiple lines:

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

    etc.

    I don't know if there is a better way...

    0 讨论(0)
  • 2020-12-19 03:43

    While the answer by @SpeakEasy can ignore .so files in a single step using *.so*, for your use case of ignoring files in formats specified, you can use two entries in your .gitignore for more specific ignore rule

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

    From gitignore man page

    Each line in a gitignore file specifies a pattern.

    Git treats the pattern as a shell glob suitable for consumption by fnmatch

    The important thing to note is that the pattern is not the same as regular expressions.

    Python has a module named fnmatch, you can use that to verify whether a particular filename matches the pattern or not.

    Sample example:

    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 讨论(0)
  • 2020-12-19 03:46

    Does adding the line *.so* not work? Or do you need more fine control?

    0 讨论(0)
提交回复
热议问题