.gitignore 目录的最快方法是什么:有或没有尾部斜杠和 **?

What is fastest way to .gitignore a directory: With or without trailing slash and **?

我想使用 .gitignore 从 git 存储库中排除目录 'dir'。没有进一步的排除模式应该用 !/dir... 引用它,它只能在 .gitignore.

中被提及一次

对于 git 应用并决定不进一步查看目录,这些备选方案中的哪一个最快?

模式匹配在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 当然最终会累加起来。)