PHP根据.gitignore过滤文件和路径

2024-02-04

我想使用 PHP 读取 .gitignore 配置忽略的所有文件和路径。就像 git 的做法一样。

可以重复读取目录并对每个文件使用正则表达式进行过滤。但如果路径中的文件过多,则效果不佳。

有什么好的和最有效的方法来读取 .gitignore 忽略的目标文件和路径?


您需要分几个步骤进行:

1 - 找到 .gitignore 文件

每个文件夹都可以有一个,因此不要假设只有一个文件夹。

子模块有一个指向主 .git 文件夹的 .git 链接,因此也要小心不要过早停止。

它会像这样:

function find_gitignore_files($dir) {
  $files = array();
  while (true) {
    $file = "$dir/.gitignore";
    if (is_file($file)) $files[] = $file;
    if (is_dir("$dir/.git") && !is_link("$dir/.git")) break;  # stop here
    if (dirname($dir) === '.') break;                         # and here
    $dir = dirname($dir);
  }
  return $files;
}

2 - 解析每个 .gitignore 文件

您需要忽略注释,注意否定运算符 (!),并注意球体。

无论给予还是接受,这将是这样的:

function parse_git_ignore_file($file) { # $file = '/absolute/path/to/.gitignore'
  $dir = dirname($file);
  $matches = array();
  $lines = file($file);
  foreach ($lines as $line) {
    $line = trim($line);
    if ($line === '') continue;                 # empty line
    if (substr($line, 0, 1) == '#') continue;   # a comment
    if (substr($line, 0, 1) == '!') {           # negated glob
      $line = substr($line, 1);
      $files = array_diff(glob("$dir/*"), glob("$dir/$line"));
    } else {                                    # normal glob
      $files = glob("$dir/$line");
    }
    $matches = array_merge($matches, $files);
  }
  return $matches;
}

(注意:以上均未经过测试,但它们应该能让您朝着正确的方向前进。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP根据.gitignore过滤文件和路径 的相关文章

  • 如何使用 phpunit 运行单个测试方法?

    我正在努力运行一个名为testSaveAndDrop在文件中escalation EscalationGroupTest php with phpunit 我尝试了以下组合 phpunit EscalationGroupTest escal
  • Git:忽略版本控制文件

    gitignore 文件对于忽略一些我们不想控制的文件非常有用 不幸的是 当文件已处于版本控制之下时 它无法使用 例如 我的 gitignore 已添加到 git 中 文件可能与我的同事想要的不同 例如我想忽略 Vim 文件 每当我对此文件
  • PHP 会话不适用于游戏

    我正在尝试模仿一款名为 SKUNK 用骰子玩 的游戏来完成一项作业 我无法让会话正常工作 这是我第一次使用 PHP 我还被告知无需会议即可完成 这是我的代码
  • 如何在现有裸存储库中创建引用日志信息

    您可能已经知道 默认情况下 git 不会为新的裸存储库启用引用日志更新 问题是 我有一个很长的历史存储库 但它是在我设置 logAllRefUpdates 标志之前创建的 现在我希望其他应用程序可以使用该信息 如何通过对现有存储库进行最少的
  • 如何使用 php 发送服务器错误响应?

    一旦用户点击删除按钮我的 jQuery 脚本要求服务器删除所选项目 现在我想要我的php发送成功或错误响应的脚本 是否有可能触发错误回调万一该项目无法删除 Thanks 我的 jQuery 代码 ajax type post url myA
  • 为什么我需要结束 ob_start()?

    php 文档建议我应该用 ob end flush 结束每个 ob start 我在网站的每个页面上使用一个 只是为了允许我在应用程序中的任何位置使用 firephp 日志方法 该应用程序运行良好 但我想知道是否有任何我不知道的东西可能有害
  • 如何在原则 2 迁移中删除外键

    我想在原则 2 迁移中删除外键 但没有 dropForeignKeyConstraint 有谁知道怎么丢掉吗 public function down Schema schema table schema gt getTable table
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • PHP 在输入流中使用 fwrite 和 fread

    我正在寻找将 PHP 输入流的内容写入磁盘的最有效方法 而不使用授予 PHP 脚本的大量内存 例如 如果可以上传的最大文件大小为 1 GB 但 PHP 只有 32 MB 内存 define MAX FILE LEN 1073741824 1
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 在 apache docker 容器中运行虚拟主机

    我在同一个 apache 容器中有两个 php 应用程序 我试图在端口上运行其中一个应用程序 因为它需要通过根域而不是子文件夹进行访问 我想在端口 8060 上运行应用程序 我尝试使用 apache 虚拟主机执行此操作 但它不会加载页面 h
  • 如何在 git 中将我的功能分支变基到开发分支,尽可能减少冲突?

    我的功能分支已超过大约 30 次或更多提交 与此同时 在开发分支中 其他开发人员还推出了一些其他功能 因此 每次在开发中发布新功能时 我都会被要求 将开发分支重新建立到我的功能分支上 解决冲突 如有 继续在您的功能分支中开发 问题 第二步就
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • PHP HEREDoc (EOF) 语法在 Sublime Text 3 上突出显示与正斜杠的差异

    我不熟悉 Sublime Text 3 如何使用语法突出显示 例如 如果它纯粹依赖于主题 或者它内置于主题运行的标准中 但就我而言 使用 PHP 的 HERE 文档和转发存在一些语法突出显示差异斜线 一旦出现正斜杠 ST3 就会认为以下所有
  • 简单的 PHP 表单:电子邮件附件(代码 Golf)

    想象一下 一个用户想要在其网站上放置一个表单 该表单将允许网站访问者上传一个文件和一条简单的消息 该消息将立即通过电子邮件发送 即 该文件未存储在服务器上 或者如果该文件存储在服务器上 仅暂时 作为文件附件 并在邮件正文中添加注释 查看更多
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • 外部内联函数会发生什么?

    如果我在 h 文件中将函数定义为 extern int returnaint void 在相关的 c 文件中将其定义为 inline int returnaint void return 1 并将标头包含在另一个 c 文件中并使用该函数 当
  • 适用于 html5 和 jquery 应用程序的条码扫描器

    我正在一个项目中使用 Jquery 和 html 它是一个静态 Web 应用程序 我需要一个 jquery 来读取产品中条形码扫描仪的条形码 需要扫描条形码而不在屏幕的任何文本框中显示代码 有人请给我一些想法或为我提供插件的链接 如果有 来
  • PHP 中 C# 的“List ”等价物是什么?

    我正在使用一个 API 它要求我提供一个List
  • EF Code First:使用 Fluent API 映射非表对象

    我应该如何使用 Fluent API 映射 EF Code First 中的重要对象 例如视图 StoredProcedure 等 代码优先中尚不支持映射到存储过程和 vew 这些是 Julia Lerman 的编程实体框架 代码优先的一些
  • 带有两个 ArrayList 的 Android ListView 适配器

    In our chat app we want to use cool new Library SQLBrite https github com square sqlbrite to update chat on database cha
  • 未找到特征“Illuminate\Foundation\Auth\Access\AuthorizesResources”

    有人熟悉我遇到的这个错误吗 请帮忙谢谢 如果您使用 Laravel 5 3 请执行以下操作 来自升级指南 AuthorizesResources Trait AuthorizesResources 特征已与 AuthorizesReques
  • VS 2012 / 2013 AccessViolationException

    当我运行项目 F5 时 我在 IDE 中收到以下异常 An unhandled exception of type System AccessViolationException occurred in System Windows For
  • 仅包含单个 mp4 文件的 MPEG-DASH 视频流

    我研究了一周 寻找一种简单且独立于平台的方法 将 mp4 文件传输到任何浏览器 如果浏览器不兼容 将使用渐进式流 直接下载 方法 我的场景是这样的 单个 mp4 文件 未分段和复用 音频 视频 支持 HTTP 字节范围服务 在浏览器不兼容的
  • Android studio 重命名包后抛出 Nomatching client found

    我按照下面的链接重命名了包 重命名后 当我尝试构建项目时 android studio 会抛出类似的错误 Android Studio重命名包 https stackoverflow com questions 16804093 andro
  • 多个if条件excel,矩阵结构

    Box type Box type Box type Box type BinLoc 810 811 911 822 S1 2 0 1 0 S2 4 2 2 1 S3 12 6 6 3 S4 24 12 12 6 R1 48 24 24 1
  • Akka 消息传递保证

    我正在尝试找出 Akka 支持哪些消息传递保证 我得出以下结论 最多一次 默认支持 至少一次 由 Akka Persistence 支持 恰好一次 Akka支持exactly once吗 如果不这样做 我怎样才能实现这一目标 正如您所发现的
  • 提高处理具有 1 亿个元素的 ArrayList 时的速度和内存消耗

    我使用其中包含短字符串 10 位数字 的文本文件 文件大小约为1 5Gb 因此行数达到1亿行 每天我都会收到另一个文件 需要提取新元素 每天数万个 解决我的问题的最佳方法是什么 我尝试在 ArrayList 中加载数据 每个文件大约需要 2
  • Flutter:如何监听 FirebaseUser 是否已通过电子邮件验证布尔值?

    My Idea 我想在 Flutter 中使用 Firebase Auth 插件来注册用户 但在他们可以访问该应用程序之前 他们必须验证自己的电子邮件地址 因此 我在注册后将 Firebase 用户推送到验证屏幕 这只是一个加载屏幕 告诉用
  • PHPUnit的白名单和黑名单似乎被忽略

    我正在一个项目上设置 PHPUnit 该项目的结构如下 build src service PHP source code files here tests php unit PHP unit tests here bootstrap ph
  • 文本对齐中心 - shell 脚本

    我正在使用 shell 脚本创建一个基于控制台的简单脚本 它将在我的 bash shell 上运行 它是一个简单的基于菜单的驱动显示一些选项集 现在我想根据屏幕尺寸将文本居中对齐 如何将文本对齐到屏幕中央 请帮助我 最后我找到了解决方案 C
  • 在导航栏中添加自定义视图,例如whatsapp

    我想创建自定义导航栏 就像 WhatsApp 用来在应用程序中显示呼叫指示器一样 如下所示 我已成功添加如上所述的视图 但它没有响应 因为我无法检测到状态栏上的触摸 我只能触摸 触摸返回通话 下面的部分 代码如下 property nona
  • 模拟乘法加法的算法

    如何设计一种算法来模拟乘法加法 输入两个整数 它们可能为零 正数或负数 def multiply a b if a 1 return b elif a 0 return 0 elif a lt 0 return multiply a b e
  • XML 注释和“--”

    偶数个 s 似乎也无效 如果它是一些历史特征 那么它的 专业 部分是什么 反对 部分是无法拥有 在评论中 不以 gt 作为注释结尾并允许在内部添加 从而使注释处理复杂化的原因是什么 也许这对某人有帮助 我遇到了一个问题 我想注释掉 XML
  • 保护 EC2 Amazon Marketplace AMI 上的文件夹安全

    我计划创办一家小型企业并向 Amazon 的 AWS Marketplace 提交 Linux AMI 当我阅读卖家指南时 我看到了这一点 AMI 必须允许操作系统级管理功能 以实现合规性要求 漏洞更新和日志文件访问 对于基于 Linux
  • PHP根据.gitignore过滤文件和路径

    我想使用 PHP 读取 gitignore 配置忽略的所有文件和路径 就像 git 的做法一样 可以重复读取目录并对每个文件使用正则表达式进行过滤 但如果路径中的文件过多 则效果不佳 有什么好的和最有效的方法来读取 gitignore 忽略