如何将.gitignore中的目录列入白名单,并将其内的文件列入~/.gitignore中的黑名单?
关于这个主题有很多问题,但没有一个涉及到如何将.gitignore中的目录列入白名单,并将其内的文件列入~/.gitignore中的黑名单?,git,configuration,gitignore,home-directory,Git,Configuration,Gitignore,Home Directory,关于这个主题有很多问题,但没有一个涉及到~/.gitignore 我有一个奇怪的项目,它有一个顶级项目目录,叫做project/,充满了垃圾,但至少有一个重要的子目录,比如project/feedme/。我想.gitignore忽略project/中的所有内容,但取消.gitignoreproject/feedme/及其内容。使用否定模式很容易: project$ cat .gitignore /* !/feedme/ 我有一个文件project/feedme/.exrc,我想忽略它。作为v
~/.gitignore
我有一个奇怪的项目,它有一个顶级项目目录,叫做
project/
,充满了垃圾,但至少有一个重要的子目录,比如project/feedme/
。我想.gitignore
忽略project/
中的所有内容,但取消.gitignore
project/feedme/
及其内容。使用否定模式很容易:
project$ cat .gitignore
/*
!/feedme/
我有一个文件project/feedme/.exrc
,我想忽略它。作为vi
用户,我经常使用.exrc
文件进行本地编辑器设置,因此我在~/.gitconfig
中有一个条目(由core.excludesFile
Git设置指定):
不幸的是,git
似乎不想重新统治。exrc
:
project$ git status -s
?? feedme/
project$ git add feedme/
project$ git status -s
A feedme/.exrc
为什么Git不忽略project/feedme/.exrc
编辑:根据,此部分错误。请参阅我在问题末尾的编辑,因为它尚未得到完全回答。 为什么我认为这应该有效?手册页面gitignore(5)这样说: gitignore文件中的每一行指定一种模式。决定时 无论是否忽略路径,Git通常会从 多个源,按照以下优先顺序,从最高 到最低(在一个优先级别内,最后一个匹配模式 决定结果):
- [……]
- 从.gitignore文件读取的模式与
路径,或在任何父目录中,具有更高级别的模式
被覆盖的文件(直到工作树的顶层)
那些位于较低级别文件中的文件将被下放到包含
文件[……] - [……]
- 从配置变量指定的文件中读取的模式 核心。排除文件
~/.gitignore
中的模式是最后读取的,因此我认为无论本地.gitgnore
如何,.exrc
最终都会被忽略
一种可能的解释是,这(同样来自于gitignore(5)手册页,强调我的)
是的
如果某个文件的父目录为,则不可能重新包含该文件
文件被排除在外
也适用于其双重形式(不在手册页中)
是的
如果某个文件的父目录
文件被重新包括在内
如果是这样的话,我会认为这是一个错误;至少应在文件中明确说明
注意:我的
~/.gitignore
在正常情况下工作,因此不存在问题
编辑 Prosoitos是正确的,首先读取全局
~/.gitignore
,因此项目/feedme/
子目录在之后重新包含。exrc
被全局忽略。然而,我仍然面临另一个奇怪的问题
根据我现在对文档的理解,将.exrc
放在~/.gitignore
的最后一行等同于将.exrc
放在项目/.gitignore
的第一行。但是如果我这样做,project/feedme/.exrc
这次被忽略了
project$ cat ~/.gitignore
project$ cat .gitignore
.exrc
/*
!/feedme/
project$ git ls-files --other --ignored --exclude-standard
.gitignore
feedme/.exrc
这里发生了什么
因为~/.gitignore中的模式是最后读取的[…]
不,这就是你弄错的地方。您引用的Git手册部分:
Git通常会检查来自多个源的gitignore模式,优先级顺序如下,从最高到最低[…]
这意味着全局的.gitignore
被本地的覆盖,而不是相反
所以/本地中的feedme/
。gitignore
覆盖全局中的。exrc
。因此,feedme/.exrc
不被排除在外
一个简单的解决方案是在本地.gitignore
文件中添加.exrc
,并确保它在行下面/feedme/
自:
(在一个优先级别内,最后一个匹配模式决定结果)
注: 诚然,“优先顺序”一词可能令人困惑 在这里,“更高的优先级”意味着它“比”(因此它覆盖)更重要 您似乎已经从运算符优先级的意义上理解了它,“更高的优先级”将意味着“在之前执行”,这将导致相反的结果。因此产生了混乱
编辑问题后再进行编辑: 既然你已经纠正了你的处境,我认为你是对的 我再现了你的情况,然后跑:
git检查忽略-v feedme/.exrc
我得到:
.gitignore:1:.exrc feedme/.exrc
表明.exrc
的排除未被否定/feedme/
我试图用谷歌搜索这个,但我也找不到关于它的任何文档
根据我现在对文档的理解,将.exrc
放在我的~/.gitignore
的最后一行相当于将.exrc
放在项目/.gitignore
的第一行(如果project/.git/info/excludes
为空)
但是如果我这样做,project/feedme/.exrc
这次被忽略了
project$ cat ~/.gitignore
project$ cat .gitignore
.exrc
/*
!/feedme/
project$ git ls-files --other --ignored --exclude-standard
.gitignore
feedme/.exrc
您已从忽略规则中排除文件夹/feedme/
,但未排除其内容。你需要
/feedme/.exrc
来自该文件,不可忽略。您似乎已经回答了自己的问题“如果排除了某个文件的父目录,则不可能重新包含该文件。”在.gitignore
的手册页中非常清楚地说明了这一点,或者您正在寻找另一种c语言
project$ cat ~/.gitignore
project$ cat .gitignore
.exrc
/*
!/feedme/
project$ git ls-files --other --ignored --exclude-standard
.gitignore
feedme/.exrc