创建 tar 存档时 phar 排除目录

Posted

技术标签:

【中文标题】创建 tar 存档时 phar 排除目录【英文标题】:phar exclude directories when creating tar archive 【发布时间】:2014-12-16 16:38:25 【问题描述】:

我想使用内置的PharData 类在 php 脚本中创建一个 tar 存档。

我希望 tar 存档代表一个目录,所以我想使用 PharData::buildFromDirectory() 来做到这一点。不幸的是,该目录也是一个 git 存储库,其中有一个 .git 文件夹,它比目录本身大得多。

所以我需要从存档中删除那个.git 目录(最好是.idea 目录...),因为它会不必要地膨胀。

到目前为止我尝试了什么:

使用正则表达式过滤掉目录:

$archive->buildFromDirectory("..", "@^(?!.git).+@");

这没用。

使用PharData::delete(),但不幸的是,这似乎只删除了一个文件而不是一个目录。

那么,做我想做的最好的方法是什么?

【问题讨论】:

【参考方案1】:

我已经看到以下用于使用否定前瞻排除 git 目录的方法:

$phar->buildFromDirectory(__DIR__, '/^((?!\.git).)*$/');

【讨论】:

【参考方案2】:

您的正则表达式的问题是文件的完整路径 匹配,而不仅仅是目录(基本名称)。因此,您无法过滤掉.git 目录本身。

使用字符类否定 ([^.][^g][^i][^t]) 也无济于事,因为路径的某些部分确实匹配此正则表达式,因此路径仍然匹配。

这意味着您只能使用肯定匹配。


您可以使用Phar::buildFromIterator,然后使用RecursiveFilterIterator 过滤掉文件。 在那里您可以定义自己的匹配方法来正确过滤。

【讨论】:

以上是关于创建 tar 存档时 phar 排除目录的主要内容,如果未能解决你的问题,请参考以下文章

使用tar时排除目录

创建 .tar.gz 文件时排除目录

使用 tar 时排除目录

添加到 tar 存档后删除文件

通过排除其父文件夹为多个目录创建单个 tar 文件

如何在不包含父目录的 Python/tar 中创建 tar.gz 存档?