Git:如何忽略子目录中的匹配目录?

Dan*_*nor 17 git gitignore

我有一个具有以下结构的项目:

/.
  /src
    /project1
      /bin
      /obj
    /project2
      /bin
      /obj
  /tools
    /tool1
      /bin 
Run Code Online (Sandbox Code Playgroud)

我可以添加到.git/info/exclude中以忽略"src"下的所有bin/obj目录?我不想明确指定每个项目名称.

Lar*_*eth 21

尝试将这些行添加到.gitignore文件中:

src/*/bin
src/*/obj
Run Code Online (Sandbox Code Playgroud)


Dre*_*kes 17

接受的答案对我不起作用.

> git --version
git version 1.7.0.2.msysgit.0
Run Code Online (Sandbox Code Playgroud)

似乎正斜杠不能与.gitignore文件中的msysgit一起使用.这有效.

*\bin
*\obj
Run Code Online (Sandbox Code Playgroud)

然而,将匹配排除名为任何文件binobj过多,这是不太可能是一个问题,除了当它.以下解决了这个问题(是的,在这种情况下正斜杠工作):

bin/
obj/
*.user
*.suo
Run Code Online (Sandbox Code Playgroud)

这将匹配.gitignore放置文件的文件夹下层次结构中不同深度的文件.请注意,当我为特定子文件夹包含前缀时,上述操作无效,因此我将其Source直接放在我的文件夹中.

作为Visual Studio用户(可能是OP来自bin/obj引用),排除.user.suo文件也很好.


gitignore规范:

模式具有以下格式:

  • 空行不匹配任何文件,因此它可以作为可读性的分隔符.

  • 以#开头的行作为注释.

  • 一个可选的前缀!否定了这种模式; 之前模式排除的任何匹配文件将再次包含在内.如果否定模式匹配,则将覆盖较低优先级模式源.

  • 如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会找到与目录的匹配项.换句话说,foo /将匹配目录foo和它下面的路径,但是不匹配常规文件或符号链接foo(这与pathpec在git中的工作方式一致).

  • 如果模式不包含斜杠/,git将其视为shell glob模式,并检查相对于.gitignore文件位置的路径名的匹配(相对于工作树的顶层,如果不是来自.gitignore)文件).

  • 否则,git将模式视为适合fnmatch(3)使用FNM_PATHNAME标志的shell glob:模式中的通配符与路径名中的/不匹配.例如,"Documentation/*.html"匹配"Documentation/git.html",但不匹配"Documentation/ppc/ppc.html"或"tools/perf/Documentation/perf.html".

  • 前导斜杠与路径名的开头匹配.例如,"/*.c"匹配"cat-file.c"但不匹配"mozilla-sha1/sha1.c".


CB *_*ley 9

最明显的方法是将这些添加到src/.gitignore:

obj/
bin/
Run Code Online (Sandbox Code Playgroud)

这会忽略目录调用中的任何路径obj,或者bin从src目录向下调用的目录.

如果你有一个锯齿状的项目层次结构,其中有一些和目录在树下面src/*/obj/,那么顶级的东西.gitignore可能不起作用.objbin

这是快速测试shell脚本,显示了操作中的忽略规则:

#!/bin/sh
mkdir src
mkdir tools

mkdir src/project1
mkdir src/project2
mkdir tools/tool1

mkdir src/project1/bin
mkdir src/project1/obj
mkdir src/project2/bin
mkdir src/project2/obj
mkdir tools/tool1/bin

touch testfile
touch src/testfile
touch tools/testfile
touch src/project1/testfile
touch src/project2/testfile
touch tools/tool1/testfile
touch src/project1/bin/testfile
touch src/project1/obj/testfile
touch src/project2/bin/testfile
touch src/project2/obj/testfile
touch tools/tool1/bin/testfile

git init

add_empty() { touch "$1" && git add "$1"; }

add_empty dummy
add_empty src/dummy
add_empty tools/dummy
add_empty src/project1/dummy
add_empty src/project2/dummy
add_empty tools/tool1/dummy

git status

printf 'obj/\nbin/\n' >src/.gitignore && git add src/.gitignore

git status
Run Code Online (Sandbox Code Playgroud)

第一个状态的未跟踪文件部分是:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       src/project1/bin/
#       src/project1/obj/
#       src/project1/testfile
#       src/project2/bin/
#       src/project2/obj/
#       src/project2/testfile
#       src/testfile
#       testfile
#       tools/testfile
#       tools/tool1/bin/
#       tools/tool1/testfile
Run Code Online (Sandbox Code Playgroud)

添加.gitignore文件后:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       src/project1/testfile
#       src/project2/testfile
#       src/testfile
#       testfile
#       tools/testfile
#       tools/tool1/bin/
#       tools/tool1/testfile
Run Code Online (Sandbox Code Playgroud)

作为测试,证明Git是不是忽略文件叫objbin而无视objbin运行此脚本后的目录进一步下跌的层次结构:

#!/bin/sh
mkdir src/project3
touch src/project3/testfile && git add src/project3/testfile
touch src/project3/obj
touch src/project3/bin

mkdir src/subdir
mkdir src/subdir/proj
touch src/subdir/proj/testfile && git add src/subdir/proj/testfile
mkdir src/subdir/proj/obj
mkdir src/subdir/proj/bin
touch src/subdir/proj/obj/testfile
touch src/subdir/proj/bin/testfile
Run Code Online (Sandbox Code Playgroud)

新的未跟踪文件是:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       src/project1/testfile
#       src/project2/testfile
#       src/project3/bin
#       src/project3/obj
#       src/testfile
#       testfile
#       tools/testfile
#       tools/tool1/bin/
#       tools/tool1/testfile
Run Code Online (Sandbox Code Playgroud)