【发布时间】:2016-02-26 00:59:13
【问题描述】:
我是一个实用程序的作者,它使使用 zip 压缩项目变得更容易一些,尤其是当您必须定期压缩时,例如更新提交到应用商店(如 Chrome 的网上应用店)的项目。
我正在尝试进行很多改进,但遇到了一个问题,如下所述。
快速概览
我的实用程序的命令格式类似于command OPTIONS DEST DIR1 {DIR2 DIR3 DIR4...}。它通过运行zip -r DEST.zip DIR1 工作;一个相当简单的过程。然而,我的实用程序的好处是能够使用预定文件(想想.gitignore)来忽略特定文件/目录,或与模式匹配的文件/目录。
这很简单——如果“ignorefile”存在于目标目录(DIR1、DIR2、DIR3 等)中,我的实用程序将使用模式-x some_file 或-x some_dir/* 将排除项添加到zip -r DEST.zip DIR1 命令。
问题
但是,我遇到了目录排除问题,我不太明白为什么(这可能是因为我还是个新手)。我将通过一些示例:
假设我想忽略项目目录中的两件事:.git/* 和 .gitignore。运行 command foo.zip project_dir 构建以下命令:
zip -r foo.zip project -x project/.git/\* -x project/.gitignore
哇哦!成功!嗯……不完全是。
在此示例中,.gitignore 未添加到压缩输出文件 foo.zip。目录.git/* 及其所有子目录(和文件)被添加到压缩输出文件中。
手动运行命令:
zip -r foo.zip project_dir -x project/.git/\* -x project/.gitignore
当然可以按预期工作,所以我很自然地很困惑为什么我的相同但动态构建的命令不起作用。
尝试的解决方案
我尝试了几种不同的方法来解决这个问题:
从命令中删除
-x project/.git/\*,而是在该目录中添加每个子目录和文件,例如-x project/.git/config -x project/.git/HEAD等(包括子目录的子目录)删除星号前的反斜杠,使命令中的排除选项为
-x project/.git/*焦虑地敲击键盘(我真的很惊讶这不起作用,它通常会起作用)
一些注意事项
我的实用程序使用
/bin/sh;我宁愿保持这种方式以获得最大的兼容性。我知道
git archive功能——我在上面的例子中使用.git/*和.gitignore只是作为一个例子;我的实用程序不依赖于 git,也不专门用于作为 git 存储库的项目。
【问题讨论】:
-
你是如何运行你生成的命令的?这是关键部分,没有显示。另外,我很感谢您花时间讲述完整的故事,但下次直接解决问题。问题需要简洁直接。
-
@sidyll,命令存储在变量COMMAND中,然后使用
$COMMAND执行(我也使用过${COMMAND})。您为我指明了正确的方向,并且使用eval $COMMAND按预期工作。如果您想写一个答案,我可以将其标记为正确。 -
感谢您重新提出问题。不是因为积分,而是留下它可能对可能遇到类似问题的未来观众有用。这是这个网站背后的伟大意图,维护一个解决方案的数据库。最好的祝愿本杰明
-
这正是我留下强有力的描述的原因;)——尽管在大多数情况下直接和简洁绝对是更可取的!再次感谢,继续摇滚!