开发者

Strange behavior of .gitignore

Here you go:

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)

Can anybody explain why an empty .gitignore is not equivalent to the one with:

*
!foo/

in this case?


You managed to make the directory foo "not ignored", but everything within foo is still matched by the '*' pattern.
This will remove foo content from the gitignore '*' initial directive:

*
!/foo/
!/foo/*

or:

*
!/foo/

plus a .gitignore in foo with:

!*


The pattern * will match anywhere in your working tree, including matching any files in directories called foo.

Looking at your tree, what you probably want to do is only match all entites at the top level of your tree, except for directories called foo, so that anything under foo will still be tracked by default.

/*
!foo/

It may also make sense to root the second patter at the root of the working tree too.

/*
!/foo/
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜