Как мне сжать папку, но исключить подпапку .git

196

Я пытаюсь создать zip-файл из папки, и я хотел бы исключить .gitподпапку из полученного zip-файла.

Я перешел в родительскую папку той, которую хочу заархивировать (она называется bitvolution ), и я делаю:

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

Но это не исключает .gitподпапку.

Я пробовал различные комбинации, -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. Я также попытался использовать полный путь для аргумента исключения ... но просто не получил там.

Том
источник

Ответы:

234

Правильное выражение -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каталогами в любом месте дерева каталогов.

Исайя
источник
20
Я должен был завернуть шар в кавычки или избежать звездочек с обратными слешами, как zip --exclude '*.git*' -r directory.zip directoryилиzip --exclude \*.git\* -r directory.zip directory
Дмитрий Минковский
6
Если вы беспокоитесь о потере других файлов, называемых что-то.git, что угодно, вы также можете использовать --exclude /.git*.
Эрин Позвони
4
в ZSH пришлось добавить обратную косую черту:-x \*.git\*
ДмитрийСандалов
2
Моя любимая альтернатива обратным слешам и кавычкам в zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Себастьян
Как использовать это с tar? Это не работает с командой tar.
Р.Н. Кушваха,
124

Если вы пытаетесь заархивировать проект, который хранится в Git, используйте git archiveкоманду. Из исходного каталога:

git archive -o bitvolution.zip HEAD

Вы можете использовать любой коммит или идентификатор тега вместо того, HEADчтобы заархивировать проект в определенный момент.

Если вы хотите добавить префикс (например, папку верхнего уровня) к каждому файлу:

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

Вы также можете настроить уровень сжатия от 0 (без сжатия) до 9 (максимальное сжатие) включительно, например

git archive -o bitvolution.zip -9 HEAD

Другие варианты см. На странице справки ( git help archive).

блэр
источник
25
Это не только не включает в себя папку git, но и все, что находится в файле gitignore, также будет исключено. Вы, сэр, получите голос.
JoeMoe1984
1
Как раз то, что я хотел сделать!
Бьярте
Я опаздываю на вечеринку, но это меня просто потрясло. Отличный ответ!
Том
мне интересно, почему это не лучший ответ
Набтрон
для меня это был величайший TIL сегодня ...
Шон Цикория,
27

Я добавил обратную косую черту:

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

Страница man о обратной косой черте:

Обратная косая черта позволяет избежать подстановки имени файла оболочки, поэтому сопоставление имен выполняется zip на всех уровнях каталогов.

Прийт Тамбоом
источник
в Ubuntu 14.04 добавлены звездочки с косой чертой для исключения каталогов
Dimitry K
6

Предполагая, что на компьютере, на котором вы это делаете, установлен git, вы также можете использовать сам git для создания своего архива.

git archive --format=zip HEAD -o bitvolution.zip
Тату Лахтела
источник
2

Если вы используете 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/*
g10guang
источник
Спасибо! Вот что сработало для меня, используя Bash на Ubuntu на Windows.
Адриано Монекки
Я не понял, как работает этот шаблон, но у меня сработало на Zsh.
подписать