这是我当前目录的内容。
$ ls
foo.foo
$ ls -a
. .. .bar.foo .foo foo.foo .gitignore
然后我将此目录转换为git存储库。
$ git init
Initialized empty Git repository in /home/lone/foo/.git/
$ ls -a
. .. .bar.foo .foo foo.foo .git .gitignore
以下是.gitignore
的内容。
$ cat .gitignore
*.foo
我发现.gitignore
中的模式与shell中的相同模式的行为不同。在shell *.foo
中只匹配非隐藏文件,即不以句点开头的文件名。
$ echo *.foo
foo.foo
但*.foo
中的.gitignore
似乎匹配任何隐藏或非隐藏的文件,以.foo
结尾。
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
nothing added to commit but untracked files present (use "git add" to track)
我在哪里可以了解更多关于.gitignore遵循的模式的精确定义,以便我可以理解它的行为与shell glob模式的行为不同的位置和原因?
答案 0 :(得分:10)
gitignore
在glob convention:
*
”
Git将模式视为适合
fnmatch
(3) 消费的shell glob,其中FNM_PATHNAME
flag :模式中的通配符不匹配路径名中的/
。例如,“
Documentation/*.html
”匹配“Documentation/git.html
”但不匹配“Documentation/ppc/ppc.html
”或“tools/perf/Documentation/perf.html
”。
OP Lone Learner询问in the comments:
shell是否也使用
fnmatch
(3) 来处理glob模式?
在这种情况下,为什么*
之前不匹配零个字符。 (即隐藏文件),但gitignore呢?
因为那是shell configuration choice。
输入(使用shopt
,specific to bash):
shopt -s dotglob
echo *.foo
.foo foo.foo
那是使用dotglob
如果设置,Bash包含 filename expansion 结果中以“
.
”开头的文件名。 (对于pattern matching)
答案 1 :(得分:3)
.gitignore
只包含您希望告知 git不要跟踪的模式的条目(通配符支持)。
此配置存储在文件夹级别 在那里,您可以指定要忽略的文件 此文件将以递归方式应用于内部的所有子文件夹。
.gitignore
以交换方式收集信息: System level - (全局),例如,如果您是unix用户,并且您希望忽略所有项目的*.so
个文件,那么您将放置它在全局文件中
本地 - 通常会在项目级别申请指定项目的所有内容。
每文件夹 - 给定文件夹的特定定义(例如 - 忽略密码文件,日志文件等或您要忽略的任何其他资源)
还有一个配置属性core.excludesfile
,允许您设置要使用的被忽略文件。
git config --global core.excludesfile ~/.gitignore
您还可以通过在文件前添加!
来指定哪些文件不要忽略,以便不被忽略(请阅读以下有关通配符的详细信息)可以使用的。)
要了解您可以阅读的语法here 您可以使用第三方工具为您生成此文件gitignore.io。
我无法在页面中找到
*
匹配零个或多个字符并匹配隐藏文件的内容
文件中的每一行都可以包含具有以下通配符的任何模式:
?
=匹配给定模式的零次或一次*
=匹配给定模式的零次或多次出现+
=匹配给定模式的一个或多个匹配项@
=匹配其中一个给定的模式!
=匹配除了某个给定模式之外的任何内容。
在评论中,您询问了有关*模式的信息。
您可以在此处看到*
忽略所有文件。 Git并不关心它是否是一个隐藏文件。它只是寻找匹配的模式。
如上所述,git尝试匹配您在.gitignore
文件中提供的模式,因此如果您希望忽略内部文件夹中的文件,则必须指定内部文件夹。这是文件夹内容的演示以及如何忽略内部文件。您可以看到内部文件夹aa
包含文件,但由于忽略文件包含**/
模式,它将忽略所有内部文件夹和文件。