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

Ang*_*lao 4 php git path gitignore

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

可以重复读取目录并使用正则表达式对每个文件进行过滤.但如果路径文件太多,它就无效了.

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

Den*_*rdy 9

您需要执行以下几个步骤:

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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

(注意:以上都没有经过测试,但它们应该让你朝着正确的方向前进.)