.gitignore 目录的最快方法是什么:有或没有尾部斜杠和 **?
What is fastest way to .gitignore a directory: With or without trailing slash and **?
我想使用 .gitignore 从 git 存储库中排除目录 'dir'。没有进一步的排除模式应该用 !/dir...
引用它,它只能在 .gitignore.
中被提及一次
对于 git 应用并决定不进一步查看目录,这些备选方案中的哪一个最快?
/dir
/dir/
/dir/*
/dir/**
模式匹配在git/dir.c中实现。
相关函数好像是match_pathspec_item, do_match_pathspec, prep_exclude and treat_directory.
如果您想忽略文件夹,请使用:
/folderName
=> 忽略文件夹名称 ||来自根目录的文件名
/folderName/
=> 忽略根目录中的文件夹名称
但是如果您 folderName/
忽略名称为 folderName 的所有文件夹。我猜这会花费更多时间,因为他从根向上递归遍历所有文件夹。
但在我看来这并不重要。 gitignore对程序不重要,对程序性能没有影响。
正如您间接指出的那样,它们在语义上并不等同,因为如果 /dir
是 文件,它们的行为会有所不同。但是,如果您以某种方式“知道” /dir
实际上 是 一个目录,那么 /dir
和 /dir/
将是“高效”的方式列出这些,因为它们将省略 opening-and-reading 目录。
/dir/
效率较低还是与/dir
一样效率取决于您的OS 及其 readdir
实现:当 Git 读取目录 /
(工作树的顶部)时,它获得名称组件 .
、..
, README.txt
(假设有这样一个文件),abc
(可能是一个文件,可能是一个目录,我们假设有一个名为 abc
的东西),dir
(一个目录),以及其他任何东西。它 可能 也有一个有用的 d_type
字段:POSIX only requires a d_name
and d_ino
,但是 Linux 和 BSD 有一个 d_type
字段。 OS 将用以下之一填充 d_type
:
DT_UNKNOWN
: 我们什么都没告诉你
DT_DIR
: 此实体用于目录
DT_REG
: 此实体用于常规文件
- 此处未列出的各种其他可能性(另请参阅 Checking if a dir. entry returned by readdir is a directory, link or file. dent->d_type isn't showing the type and Git's cache.h)。
Git 将使用此值(如果可用)。如果是DT_DIR
,Git就会知道dir
是一个目录,不需要在路径上调用lstat
在决定 /dir/
实体是否匹配时。如果是DT_UNKNOWN
,Git不知道dir
代表什么样的实体,需要调用lstat
。但是,对于 /dir
锚定的 gitignore 条目,Git 并不 关心 dir
代表什么样的实体,因此它绝对不需要打电话给 lstat
。但也许它不需要调用 lstat
,所以它什么也得不到。
(应该 /dir
命名一个 文件 并且你希望 Git 存储该文件(如果它存在),或者根据需要抱怨它未被跟踪,你应该在这里使用 /dir/
而不必担心单个 lstat
系统调用的成本,即使它可能以数百微秒甚至 low-digit 毫秒而不是纳秒来衡量。但是毫秒 do 当然最终会累加起来。)
我想使用 .gitignore 从 git 存储库中排除目录 'dir'。没有进一步的排除模式应该用 !/dir...
引用它,它只能在 .gitignore.
对于 git 应用并决定不进一步查看目录,这些备选方案中的哪一个最快?
/dir
/dir/
/dir/*
/dir/**
模式匹配在git/dir.c中实现。 相关函数好像是match_pathspec_item, do_match_pathspec, prep_exclude and treat_directory.
如果您想忽略文件夹,请使用:
/folderName
=> 忽略文件夹名称 ||来自根目录的文件名
/folderName/
=> 忽略根目录中的文件夹名称
但是如果您 folderName/
忽略名称为 folderName 的所有文件夹。我猜这会花费更多时间,因为他从根向上递归遍历所有文件夹。
但在我看来这并不重要。 gitignore对程序不重要,对程序性能没有影响。
正如您间接指出的那样,它们在语义上并不等同,因为如果 /dir
是 文件,它们的行为会有所不同。但是,如果您以某种方式“知道” /dir
实际上 是 一个目录,那么 /dir
和 /dir/
将是“高效”的方式列出这些,因为它们将省略 opening-and-reading 目录。
/dir/
效率较低还是与/dir
一样效率取决于您的OS 及其 readdir
实现:当 Git 读取目录 /
(工作树的顶部)时,它获得名称组件 .
、..
, README.txt
(假设有这样一个文件),abc
(可能是一个文件,可能是一个目录,我们假设有一个名为 abc
的东西),dir
(一个目录),以及其他任何东西。它 可能 也有一个有用的 d_type
字段:POSIX only requires a d_name
and d_ino
,但是 Linux 和 BSD 有一个 d_type
字段。 OS 将用以下之一填充 d_type
:
DT_UNKNOWN
: 我们什么都没告诉你DT_DIR
: 此实体用于目录DT_REG
: 此实体用于常规文件- 此处未列出的各种其他可能性(另请参阅 Checking if a dir. entry returned by readdir is a directory, link or file. dent->d_type isn't showing the type and Git's cache.h)。
Git 将使用此值(如果可用)。如果是DT_DIR
,Git就会知道dir
是一个目录,不需要在路径上调用lstat
在决定 /dir/
实体是否匹配时。如果是DT_UNKNOWN
,Git不知道dir
代表什么样的实体,需要调用lstat
。但是,对于 /dir
锚定的 gitignore 条目,Git 并不 关心 dir
代表什么样的实体,因此它绝对不需要打电话给 lstat
。但也许它不需要调用 lstat
,所以它什么也得不到。
(应该 /dir
命名一个 文件 并且你希望 Git 存储该文件(如果它存在),或者根据需要抱怨它未被跟踪,你应该在这里使用 /dir/
而不必担心单个 lstat
系统调用的成本,即使它可能以数百微秒甚至 low-digit 毫秒而不是纳秒来衡量。但是毫秒 do 当然最终会累加起来。)