Tar папку без файлов .git?

16

Если я заархивирую папку, которая является git-репозиторием, могу ли я сделать это без включения .gitсоответствующих файлов? Если нет, как бы я поступил так с помощью команды?

chrisjlee
источник

Ответы:

23

Посмотрите сначала на git help archive. archiveкоманда git, позволяющая создавать архивы, содержащие только файлы, отслеживаемые git Вероятно, то, что вы ищете. Один пример приведен в конце справочной страницы:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz
Стефан Хименес
источник
6
это только архивы root git repo. Если использовались субмодули - их каталоги будут пустыми.
Станн
@Stann: Спасибо от другого пользователя субмодуля
Mark K Cowan
22

Самый простой ответ: Добавить --exclude-vcs

--exclude-VCS

Это исключает все каталоги системы контроля версий

Лично я пользуюсь

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

так что все, что вам нужно сделать, это добавить --exclude-vcs в конце команды.

mtelesha
источник
Все известные , я полагаю? ;)
phk
3
Все параметры должны быть вместе перед аргументами в GNU / Linux.
Джош Хабдас
2
Как сказано для GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Майкл Ирей
20

Если вы хотите, чтобы в архив входили файлы, отслеживаемые 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это не доступно? :-)
Стефан Гименес
1
@ StéphaneGimenez Наверное, нет. Но он компилируется в системах, где tarнет --excludeопций, таких как OpenBSD (который, по общему признанию, дублирует sопцию pax , но это не общее расширение синтаксиса команды tar).
Жиль "ТАК - перестань быть злым"
0

Благодаря ответу на один из моих вопросов я нашел другое решение. Итак, для полноты картины, вот решение, использующее find:

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

И если вы хотите исключить возможные .gitпапки внутри (sub) + folder:

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если поддерживается).

PHK
источник