我正在尝试从一个文件夹创建一个zip文件,但我想从生成的zip文件中排除.git子文件夹。压缩(称为bitvolution),然后我在做:

zip -r bitvolution.zip bitvolution -x ".git"


,但这并不排除.git子文件夹。已经尝试了各种组合,-x .git*-x \.git/*-x .git/\*-x \.git/\*。我还尝试将完整路径用于exclude参数...但是只是没有到达那里。

评论

-x“ .git *”为我工作。

#1 楼

正确的表达式是-x '*.git*',因此完整命令应为:

zip -r bitvolution.zip ./bitvolution -x '*.git*'


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


正确的说法是

zip -9 -r --exclude=*.svn*  foo.zip [directory-to-compress]


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

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


评论


我必须将全引号括在引号中或使用反斜杠转义星号,例如zip --exclude'* .git *'-r directory.zip目录或zip --exclude \ *。git \ * -r directory.zip目录

–德米特里·明科夫斯基(Dmitry Minkovsky)
2014年5月29日19:37

如果您担心丢失其他名为something.git的文件,也可以使用--exclude /.git*。

– Erin电话
2014-09-25 21:54

在ZSH中,我必须添加一个反斜杠:-x \ *。git \ *

–德米特里·桑达洛夫(DmitrySandalov)
2014年12月6日20:14

我对zsh中反斜杠和引号的首选替代方法:noglob zip -r out.zip someFolder -x * someExcludedFolder *

–塞巴斯蒂安
15-10-19在14:09



其中大多数似乎也将忽略您的.gitignore文件。我建议改用'* /。git / *',因为它不太宽松,或者是其他人提到的git归档方法。

–dsz
19年2月8日在4:02

#2 楼

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

git archive -o bitvolution.zip HEAD


可以使用任何提交或标记ID代替HEAD来在某个点存档项目。 >如果要在每个文件中添加前缀(例如,顶级文件夹):

git archive -o bitvolution.zip --prefix=bitvolution/ HEAD


您还可以将压缩级别调整为0(无压缩)和9(包括最大压缩),例如

git archive -o bitvolution.zip -9 HEAD

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

评论


这不仅不包括git文件夹,而且gitignore文件中的任何内容也将被排除。先生,您得到赞成票。

–JoeMoe1984
14-10-21在10:04

正是我想要做的!

– Bjarte
17-10-21在11:41

我参加聚会很晚,但这绝对让我震惊。好答案!

–汤姆
17-10-25在10:14

我不知道为什么这不是最好的答案

–nabtron
18年6月7日在1:52

对我来说,这是今天最大的TIL ...

–肖恩·西科里亚(Shawn Cicoria)
18年7月8日在17:12

#3 楼

我添加了反斜杠:

zip -r bitvolution.zip bitvolution -x \*.git\*

关于反斜杠的手册页:


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


评论


在Ubuntu 14.04上为我加上带斜线叉的星号以排除目录

– Dimitry K
16 Mar 23 '16 at 17:04

#4 楼

假设正在执行此操作的计算机上已安装git,则还可以使用git本身创建存档。

git archive --format=zip HEAD -o bitvolution.zip


#5 楼

如果使用zsh,则命令应类似于:

zip -r target_name.zip source_dir -x '/*.git/*'


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

zsh: no matches found: /*.git/*


评论


谢谢!这就是我在Windows上的Ubuntu上使用Bash的工作方式。

–阿德里亚诺·蒙尼奇(Adriano Monecchi)
18年8月30日在11:48

我不了解这种模式是如何工作的,但是在zsh为我工作。

–签名
19-2-25在11:51



#6 楼

如果要忽略整个文件夹,请使用以下格式。例如,要忽略每个端点中的每个node_modules文件夹:

zip -r API.zip API/* -x */node_modules/*


#7 楼

这是我使用的示例:
zip -r workspace.zip workspace -x '*/.git/*' -x '*/.DS_Store/*' -x '*/build/*'