如何压缩文件夹但排除 .git 子文件夹

Tom*_*Tom 281 zip

我正在尝试从文件夹创建一个 zip 文件,我想.git从生成的 zip 文件中排除子文件夹。

我已经转到我要压缩的文件夹(称为 bitvolution)的父文件夹,我正在执行以下操作:

zip -r bitvolution.zip bitvolution -x ".git"
Run Code Online (Sandbox Code Playgroud)

但它不排除.git子文件夹。

我尝试了各种组合,-x .git*, -x \.git/*, -x .git/\*, -x \.git/\*。我也试过使用排除参数的完整路径......但只是没有到达那里。

Isa*_*iah 334

正确的表达式是-x '*.git*',所以完整的命令应该是:

zip -r bitvolution.zip ./bitvolution -x '*.git*'
Run Code Online (Sandbox Code Playgroud)

来自http://selfsolved.com/problems/zip-command-exclude-svn-director的解释:

正确的咒语是

zip -9 -r --exclude=*.svn*  foo.zip [directory-to-compress]
Run Code Online (Sandbox Code Playgroud)

您还可以添加一个
--exclude=*.DS_Store*以排除烦人的 Mac OS X 目录显示元数据文件。

请注意,传递给的表达式--exclude使用整个原始相对目录路径作为要匹配的原始字符串。所以.svn/*它本身是行不通的;前面的通配符确保它匹配.svn目录树中任何位置的目录。

  • 我不得不将 glob 用引号括起来,或者用反斜杠转义星号,比如 `zip --exclude '*.git*' -r directory.zip directory` 或 `zip --exclude \*.git\* -r directory。压缩目录` (24认同)
  • 如果你担心丢失其他名为 something.gitwhatever 的文件,你也可以使用 `--exclude /.git*`。 (6认同)
  • 在 ZSH 中,我不得不添加一个反斜杠:`-x \*.git\*` (5认同)
  • 其中大多数似乎也会忽略您的“.gitignore”文件。我建议使用 `'*/.git/*'` 代替,因为它不太宽容,或者其他人提到的 `git archive` 方法。 (5认同)
  • 我在 zsh 中首选反斜杠和引号的替代方法:`noglob zip -r out.zip someFolder -x *someExcludedFolder*` (3认同)
  • 如何在排除列表中包含多个文件夹? (2认同)

Bla*_*air 174

如果您尝试压缩存储在 Git 中的项目,请使用该git archive命令。从源目录中:

git archive -o bitvolution.zip HEAD
Run Code Online (Sandbox Code Playgroud)

您可以使用任何提交或标记 ID,而不是HEAD在某个时间点存档项目。

如果要为每个文件添加前缀(例如,顶级文件夹):

git archive -o bitvolution.zip --prefix=bitvolution/ HEAD
Run Code Online (Sandbox Code Playgroud)

您还可以在 0(无压缩)和 9(最大压缩)之间调整压缩级别,例如

git archive -o bitvolution.zip -9 HEAD
Run Code Online (Sandbox Code Playgroud)

有关其他选项,请参阅帮助页面 ( git help archive)。

  • 这不仅不包括 git 文件夹,而且 gitignore 文件中的任何内容也将被排除在外。你先生得到一个upvote。 (34认同)
  • 正是我想做的! (2认同)

小智 34

我添加了反斜杠:

zip -r bitvolution.zip bitvolution -x \*.git\*
Run Code Online (Sandbox Code Playgroud)

关于反斜杠的手册页:

反斜杠避免了 shell 文件名替换,因此名称匹配由 zip 在所有目录级别执行。


小智 13

假设您在执行此操作的机器上安装了 git,您还可以使用 git 本身来创建您的存档。

git archive --format=zip HEAD -o bitvolution.zip
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您使用的是 zsh,命令应如下所示:

zip -r target_name.zip source_dir -x '/*.git/*'
Run Code Online (Sandbox Code Playgroud)

如果您使用:zip -r target_name.zip source_dir -x /*.git/*。如果没有 'regex',zsh 将在 zip 运行之前进行处理。您将收到错误消息:

zsh: no matches found: /*.git/*
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您想忽略整个文件夹,请使用以下格式。

例如,要忽略每个node_modules端点中的每个文件夹:

zip -r API.zip API/* -x */node_modules/*
Run Code Online (Sandbox Code Playgroud)


小智 6

以下是我用来删除在 MacOS 和构建文件夹上找到的 .git 文件夹和 .DS_Store 文件的示例:

zip -r workspace.zip workspace -x '*/.git/*' -x '*/.DS_Store' -x '*/build/*'
Run Code Online (Sandbox Code Playgroud)