Обміняти папку без .git-файлів?


16

Якщо я націлюю папку, яка є сховищем git, чи можу я це зробити, не включаючи .gitвідповідні файли? Якщо ні, то як би мені це зробити за допомогою команди?

Відповіді:


24

Подивіться спочатку git help archive. archive- це команда git, яка дозволяє робити архіви, що містять лише відсліджені файли git. Напевно, що ви шукаєте. Один приклад, наведений в кінці сторінки man:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

6
це лише архіви root root git repo. Якщо використовувались підмодулі - їх каталоги будуть порожніми.
Стенн

@Stann: Спасибі від іншого користувача підмодуля
Марка К Коуана

22

Найпростіша відповідь: Додати --exclude-vcs . Це виключає всі каталоги систем управління версіями

Особисто я використовую

tar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME

тому все, що вам потрібно зробити, це додати --exclude-vcsв кінці команди.


1
Всі відомі , я гадаю? ;)
phk

3
Усі параметри повинні бути разом перед аргументами на GNU / Linux.
Джош Хабдас

2
Як заявлено для GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Майкл Ірі

1
Здається, дьоготь OSX Каталіна не підтримує такий варіант ...
Fran Marzoa

21

Якщо ви хочете, щоб архів включав файли, відслідковувані git, але не саме сховище git або будь-який створений або іншим чином відслідкований файл, тоді використовуйтеgit archive .

Якщо ви спеціально хочете виключити .git але включити все інше, під Linux або FreeBSD, OSX або Cygwin, tar має простий варіант виключення каталогу:

tar -c --exclude .git -f - foo | gzip >foo.tgz

За допомогою GNU tar (тобто під Linux або Cygwin) ви можете скоротити це до tar czf foo.tgz --exclude .git foo .

POSIX спосіб створення архівів - це pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz

Чи gitкомпілюється в будь-якій системі, де tarвона недоступна? :-)
Стефан Гіменез

3
@ StéphaneGimenez Напевно, ні. Але вона компілюється в системах, де tarнемає жодної --excludeопції, наприклад OpenBSD (яка, мабуть, дублює sпараметр pax , але це не звичайне розширення синтаксису команди tar).
Жил "ТАК - перестань бути злим"

0

Завдяки відповіді, яку я отримав на одне із своїх питань, я з’ясував інше рішення. Отже, для повноти, ось рішення, яке використовує find:

find . -path './.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

І якщо ви хочете виключити можливі .gitпапки всередині (під) + папки:

find . -path '*/.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Останній може бути досягнутий за рахунок:

find . -type d -name '.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Досить зручно, якщо ви можете скористатися іншими методами фільтрації find , наприклад, датою зміни, дозволами,…

(Оскільки так часто передбачаються добре сформовані імена файлів, інакше вам потрібно використовувати нульові байти як роздільники, що може означати -print0для findі --nullдля, tarякщо вони підтримуються.)

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