.gitignore的奇怪行为

时间:2011-02-20 10:14:13

标签: git

你走了:

root@Dell: /tmp # mkdir test; cd test
root@Dell: /tmp/test # git init
Initialized empty Git repository in /tmp/test/.git/
root@Dell: /tmp/test # mkdir foo
root@Dell: /tmp/test # touch foo/a
root@Dell: /tmp/test # git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo/
nothing added to commit but untracked files present (use "git add" to track)
root@Dell: /tmp/test # cat > .gitignore << EOF
> *
> !foo/
> EOF
root@Dell: /tmp/test # git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

任何人都可以解释为什么空.gitignore不等同于:

*
!foo/

在这种情况下?

2 个答案:

答案 0 :(得分:4)

您设法使目标foo“未被忽略”,但foo中的所有内容仍然与“*”模式匹配。
这将删除gitignore'foo'初始指令中的*内容:

*
!/foo/
!/foo/*

或:

*
!/foo/

加上.gitignore中的foo,其中包含:

!*

答案 1 :(得分:1)

模式*将匹配工作树中的任何位置,包括匹配名为foo的目录中的任何文件。

查看您的树,您可能想要做的只是匹配树顶层的所有entites,但名为foo的目录除外,因此仍会跟踪foo下的任何内容默认情况下。

/*
!foo/

将第二个模式也植根在工作树的根部也是有意义的。

/*
!/foo/