18

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

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

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

4

5 回答 5

23

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

src/*/bin
src/*/obj
于 2009-07-06T16:31:32.440 回答
17

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

> git --version
git version 1.7.0.2.msysgit.0

似乎正斜杠不适用于.gitignore文件中的 msysgit。这行得通。

*\bin
*\obj

但是,这将匹配排除任何称为binor的文件obj,这不太可能是一个问题,除非它是。以下解决了这个问题(是的,在这种情况下正斜杠有效):

bin/
obj/
*.user
*.suo

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

作为 Visual Studio 用户(大概 OP 也来自 bin/obj 参考),排除.user.suo文件也很好。


gitignore 规范

模式具有以下格式:

  • 空行不匹配任何文件,因此它可以用作分隔符以提高可读性。

  • 以 # 开头的行用作注释。

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

  • 如果模式以斜线结尾,则出于以下描述的目的将其删除,但它只会找到与目录的匹配项。换句话说, foo/ 将匹配目录 foo 和它下面的路径,但不会匹配常规文件或符号链接 foo(这与 pathspec 在 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”。

于 2010-08-25T14:40:07.340 回答
9

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

obj/
bin/

这将忽略目录调用中的任何路径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

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

# 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

添加 .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

作为一个测试,以证明 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

新的未跟踪文件是:

# 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
于 2009-07-06T18:25:08.420 回答
3

让我感到困惑的是,一旦添加,无论您戴上什么掩码,文件都将保留在存储库中,除非被强制删除,因此添加了一个原始的、已编译的 Visual Studio 解决方案后,我必须清理存储库发出:

git rm --cached */obj/*
git rm --cached */lib/*
git rm --cached *.user
git rm --cached *.suo
git rm --cached *ReSharper

然后,将其添加到 .gitignore:

*/*/bin
*/*/obj
*.user
*.suo
*ReSharper*

然后承诺:

git add .
git commit -m "removed user files and binaries from repository"
于 2011-02-17T12:57:45.590 回答
1

我相信你应该能够添加

src/*/bin/*

到 .gitignore,任何与模式匹配的内容都将被忽略。

于 2009-07-06T16:28:43.863 回答