首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在.gitignore中白名单目录,并在~/..gitignore中黑名单其中的文件?

如何在.gitignore中白名单目录,并在~/..gitignore中黑名单其中的文件?
EN

Stack Overflow用户
提问于 2020-10-12 22:45:35
回答 2查看 336关注 0票数 2

关于这个主题有很多问题,但没有一个问题涉及~/.gitignore

我有一个奇怪的项目,它有一个顶级的项目目录--称为垃圾的project/-full,但是至少有一个重要的子目录--比如project/feedme/。我想把所有的东西都用.gitignore project/,但是un.gitignore project/feedme/和它的内容。对于否定的模式,这是很容易的:

代码语言:javascript
运行
复制
project$ cat .gitignore
/*
!/feedme/

我有一个文件project/feedme/.exrc,我想忽略它。作为vi用户,我经常使用.exrc文件进行本地编辑器设置,因此在~/.gitconfig中有一个条目(由core.excludesFile Git设置指定):

代码语言:javascript
运行
复制
project$ cat ~/.gitignore
.exrc

不幸的是,git似乎不想再忽视.exrc

代码语言:javascript
运行
复制
project$ git status -s
?? feedme/
project$ git add feedme/
project$ git status -s
A  feedme/.exrc

为什么Git不忽略project/feedme/.exrc

编辑:按照prosoitos' answer的说法,这个部分是错误的。看我的编辑在这个问题的结尾,因为它还没有完全回答。

为什么我觉得这个应该有效?手册页gitignore(5)这样说:

gitignore文件中的每一行指定一个模式。在决定是否忽略路径时,Git通常会检查来自多个源的gitignore模式,其优先级顺序如下:从最高到最低(在一个优先级级别内,最后一个匹配模式决定结果):

从与路径相同的目录或任何父目录中的

  • 模式从.gitignore文件中读取,其中较高级别文件中的模式(直到工作树的toplevel )被较低级别文件中的模式覆盖到包含

文件。…

从配置变量core.excludesFile.指定的文件中读取的

  • 模式

由于~/.gitignore的模式是最后读取的,所以我认为.exrc最终会被忽略,而不管本地的.gitgnore是什么。

一个可能的解释是,这(同样来自gitignore(5)手册页,强调我)

如果排除了该文件的父目录,则不可能重新包含该文件。

也适用于其双重形式(不适用于手册页)

如果重新包含该文件的父目录,则不可能排除该文件。

但是,如果是这样的话,我认为这是一个错误;至少应该在文档中明确说明。

P.S.:我的~/.gitignore在正常情况下工作,所以问题不在那里。

编辑

Prosoitos是正确的,全局~/.gitignore首先读取,因此在全局忽略.exrcs之后重新包含.exrc子目录。然而,我仍然面临着另一个奇怪的问题。

正如我现在所理解的那样,将.exrc放在~/.gitignore的最后一行(如果project/.git/info/excludes为空)等同于将.exrc放在project/.gitignore的第一行。然而,如果我这样做,project/feedme/.exrc这一次就被忽略了!

代码语言:javascript
运行
复制
project$ cat ~/.gitignore
project$ cat .gitignore
.exrc
/*
!/feedme/
project$ git ls-files --other --ignored --exclude-standard
.gitignore
feedme/.exrc

这里发生了什么事?

EN

Stack Overflow用户

发布于 2020-10-13 06:28:11

,因为~/..gitignore的模式是最后读取的.

不是的。这就是你弄错的地方。您引用的Git手册中的一节:

Git通常检查来自多个源的gitignore模式,其优先级顺序如下:从最高到最低的.

这意味着全局.gitignore会被本地覆盖,而不是反过来。

因此,!/feedme/在您的本地.gitignore超过.exrc在您的全球之一。因此,不排除feedme/.exrc

一个简单的解决方案是将.exrc添加到本地.gitignore文件中,并确保它低于!/feedme/行,因为:

(在优先级的一个级别内,最后一个匹配模式决定结果)

注意:

不可否认,“优先顺序”一词可能令人困惑。

在这里,“更高的优先级”意味着它比“更重要”(因此它覆盖)。

您似乎从操作符优先的意义上理解了它,其中“更高的优先级”意味着“在此之前执行”,这将导致相反的结果。因此产生了混乱。

编辑完问题后进行编辑:

既然你已经改正了你的处境,我认为你是对的。

我复制了你的情况,然后跑:

代码语言:javascript
运行
复制
git check-ignore -v feedme/.exrc

我得到了:

代码语言:javascript
运行
复制
.gitignore:1:.exrc  feedme/.exrc

显示.exrc的排除没有被!/feedme/所否定。

我试图谷歌这个,我也找不到任何文件。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64326256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档