Як мені зашпаркувати папку, але виключити папку .git


194

Я намагаюся створити zip-файл із папки, і я хотів би виключити .gitпід-папку з отриманого zip-файлу.

Я перейшов у батьківську папку тієї, яку я хочу застебнути ( називається бітволюцією ), і я роблю:

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

Але це не виключає .gitпідпапки.

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

Відповіді:


232

Правильний вираз є -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
Я повинен був обернути Glob в лапках або уникнути зірочок із зворотними косими рисами, як zip --exclude '*.git*' -r directory.zip directoryіzip --exclude \*.git\* -r directory.zip directory
Дмитра Миньковского

6
Якщо ви турбуєтесь про втрату інших файлів, що називаються something.gitwwhat, ви також можете використовувати --exclude /.git*.
Erin Call

4
в ZSH мені довелося додати зворотну косу -x \*.git\*
рису

2
Моя вподобана альтернатива зворотній косої риски та котирування в zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien

Як його використовувати з дьогтем? Не працює з командою tar.
RN Kushwaha

123

Якщо ви намагаєтеся скопіювати проект, який зберігається в 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
Тільки те, що я шукав!
Bjarte

Я спізнююсь на вечірку, але це абсолютно зневажило мене. Чудова відповідь!
Том

мені цікаво, чому це не найкраща відповідь
nabtron

для мене це був найбільший 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/*. без 'регулярного вираження', zsh оброблятиметься перед запуском zip. Ви отримаєте повідомлення про помилку:

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

Дякую! Саме це працювало для мене за допомогою Bash на Ubuntu в Windows.
Адріано Монеччі

Я не розумів, як працює ця модель, але працював для мене на zsh.
вступ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.