Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 忽略目录与使用通配符忽略目录_Git_Gitignore - Fatal编程技术网

Git 忽略目录与使用通配符忽略目录

Git 忽略目录与使用通配符忽略目录,git,gitignore,Git,Gitignore,我正在处理一个需要忽略某些目录的项目。以下两者之间是否有区别: path/to/mydir/* path/to/mydir/* 这是: path/to/mydir/ 我的理解是,上面的路径忽略mydir中的所有文件,包括子目录的内容,而非wildstar示例忽略所有顶级文件,而不包括子目录中的文件 这是正确的思考方式吗?我什么时候想用一个而不是另一个?我想一劳永逸地解决这个困惑 提前谢谢 以下两者之间是否有区别: path/to/mydir/* path/to/mydir/* 及 对。

我正在处理一个需要忽略某些目录的项目。以下两者之间是否有区别:

path/to/mydir/*
path/to/mydir/*
这是:

path/to/mydir/
我的理解是,上面的路径忽略mydir中的所有文件,包括子目录的内容,而非wildstar示例忽略所有顶级文件,而不包括子目录中的文件

这是正确的思考方式吗?我什么时候想用一个而不是另一个?我想一劳永逸地解决这个困惑

提前谢谢

以下两者之间是否有区别:

path/to/mydir/*
path/to/mydir/*

对。Git对
.gitignore
文件中的条目有一些有趣的行为(如特殊行为)。当我们使用un ignore指令时,它们开始出现,
!例如,path/to/mydir/file

我的理解是,上面的路径忽略mydir中的所有文件,包括子目录的内容,而非wildstar示例忽略所有顶级文件,而不包括子目录中的文件

Unignore指令表明这并不完全正确。特别是,如果忽略某个目录,则无法取消该目录中的文件。但是,如果忽略目录中的所有文件和子目录,则可以取消忽略目录中的文件(但不能取消忽略其子目录,除非明确取消忽略其中一个)

我什么时候想用一个而不是另一个

如果您希望(无论出于何种原因)Git在状态检查和自动添加期间打开目录
path/to/mydir
并读取其内容,请使用
path/to/mydir/*
。如果您不取消忽略
path/to/mydir
下的特定路径,这不会有任何区别

长描述和背景 让我们从第一个特性开始,尽管它不是这个问题的直接部分:
.gitignore
实际上并不意味着忽略。它的意思更像:不要自动添加,尤其不要抱怨某些特定的文件集未被跟踪。然而,它也意味着,在某些情况下,甚至不要查看此目录。

Git不在提交中存储目录。提交只存储文件。当Git将提交提取到工作树中时,它只需创建保存这些文件所需的任何目录

任何现有提交中包含的文件都是固定的:不可更改和永久的(当然,与提交一样永久)。不管提交中有什么,不管这些文件在其中是什么,它们永远都在那里(直到提交本身被垃圾收集,如果有的话)。因此,就
.gitignore
文件而言,它们并不真正有趣。
.gitignore
中的内容对他们没有影响:他们已经提交了

进入新提交的文件是由运行
git commit
时的索引内容决定的。1此时,
.gitignore
文件的内容再次不相关:如果索引中有某个特定的路径名和blob ID对,它将进入提交。如果某个内容不在索引中,则不会进入提交

然后,这让我们了解未跟踪文件的定义:未跟踪文件是不在索引中的文件。只要您
git向索引中添加一个文件,它就会被跟踪,只要您
git rm--cached
索引中的一个文件,它就会被未跟踪。请注意,这意味着跟踪文件集将发生更改!未跟踪不是永久性的事情:它取决于现在索引中的内容

通过“不在”索引中,它将“不在”提交中。这实际上会使它被忽视。但是Git抱怨说:嘿,这个文件没有被追踪!您现在不想添加它吗?哭哭啼啼哭哭啼啼输入
.gitignore
:这将为Git提供一个文件列表,以避免抱怨

但那是文件。目录呢

好吧,Git实际上并不存储目录,如果你有一个空目录也没关系。Git不会抱怨它,Git也不会存储它。Git将只存储文件。但是所有的文件都存在于目录中。2如果我们能列出目录,那将使我们的生活更轻松。所以我们可以

如果只有这些,事情就不会那么奇怪了。但这还不是故事的结尾。Git力求快速,为了快速,避免实际查看正在存储的文件很重要。一般来说,文件系统操作相当慢。因此,在Git用来跟踪文件的索引中,Git保留了一堆关于这些文件的辅助信息,如果可以的话,它会使用这些信息来避免查看这些文件。因此,Git实际上只在“必须”的情况下打开和读取目录

Git将打开并读取工作树的顶层目录,以找出它包含哪些文件和目录。对于每个文件,如果该文件位于索引中,则一切正常:跟踪该文件。如果文件不在索引中,那么它是未跟踪的,Git可能会抱怨。现在,我们检查
.gitinore
文件以查找ignore和unignore指令。如果文件被忽略,而不是随后被取消忽略,Git将抱怨:

?? dir/file
(对于
--short
git status
输出)

但是,对于一个目录,目录自动不在索引中。3但是它可以被忽略,如果它被忽略,那么为什么,也许我们根本不需要读取它。这会非常快,所以Git就是这么做的

如果忽略该目录,Git就不会费心打开并读取它来查找更多文件。这意味着它无法也不会在该目录中找到任何文件,因此永远不会检查这些文件是否被忽略,也不会在以后取消忽略

如果目录本身没有被忽略,Git会这样做
git add '*'    # quoted to keep the shell from expanding it
git add --all
$ cat .gitignore
*
!*/