我有一个具有以下结构的项目:
/.
/src
/project1
/bin
/obj
/project2
/bin
/obj
/tools
/tool1
/bin
我可以在.git / info / exclude中添加什么来忽略“src”下的所有bin / obj目录?我不想明确指定每个项目名称。
答案 0 :(得分:21)
尝试将这些行添加到 .gitignore 文件中:
src/*/bin
src/*/obj
答案 1 :(得分:17)
接受的答案对我不起作用。
> git --version
git version 1.7.0.2.msysgit.0
似乎正斜杠不适用于.gitignore
文件中的msysgit。这很有效。
*\bin
*\obj
然而,这将匹配排除任何名为bin
或obj
的文件,这不太可能是一个问题,除非它是什么时候。以下解决了这个问题(是的,在这种情况下,正斜杠可以正常工作):
bin/
obj/
*.user
*.suo
这会匹配放置.gitignore
文件的文件夹下层次结构中不同深度的文件。请注意,当我为特定子文件夹添加前缀时,上述操作无效,因此我将其直接放在Source
文件夹中。
作为Visual Studio用户(可能是OP来自bin / obj引用),排除.user
和.suo
文件也很不错。
模式具有以下格式:
空行不匹配任何文件,因此它可以作为分隔符以便于阅读。
以#开头的行作为评论。
可选前缀!否定了这种模式;之前模式排除的任何匹配文件将再次包含在内。如果否定模式匹配,则将覆盖较低优先级模式源。
如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会找到与目录的匹配项。换句话说,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”。
答案 2 :(得分:9)
最明显的方法是将这些添加到src/.gitignore
:
obj/
bin/
这会忽略目录调用obj
中的所有路径,或者从src目录向下忽略名为bin
的目录。
如果您的项目层次结构中包含一些src/*/obj/
和.gitignore
目录,则顶级obj
中的bin
可能无效。< / p>
这是快速测试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不会忽略名为obj
和bin
的文件,但在运行此脚本后忽略层次结构中的obj
和bin
目录:
#!/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
答案 3 :(得分:2)
对我来说,混淆是,无论你添加了什么掩码,除非被强行删除,否则文件将保留在存储库中,因此添加了原始的,已编译的可视化工作室解决方案,我不得不清理发布的存储库: / p>
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"
答案 4 :(得分:1)
我相信你应该能够添加
src/*/bin/*
到.gitignore,任何与该模式匹配的内容都将被忽略。