如何将.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