Как мне сжать папку, но исключить подпапку .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/*

Спасибо! Вот что сработало для меня, используя Bash на Ubuntu на Windows.
Адриано Монекки

Я не понял, как работает этот шаблон, но у меня сработало на Zsh.
подписать
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.