Тарболлинг без метаданных Git - PullRequest
46 голосов
/ 18 июня 2010

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

Я подумал, что можно попробовать использовать комбинацию find / egrep / xargs / tar, но каким-то образом файл tar содержит каталоги .git и файлы * .log.

Вот что у меня есть:

find -type f . | egrep -v '\.git|\.log' | xargs tar rvf ~/app.tar

Может кто-нибудь объяснить мое недоразумение здесь? Почему tar обрабатывает файлы, которые находят, а egrep фильтрует?

Я открыт и для других техник.

Ответы [ 10 ]

92 голосов
/ 19 июня 2010

Вы получите неприятный сюрприз, когда число файлов увеличится до более чем одной команды xargs: затем вы сначала создадите tar-файл из первых файлов, а затем перезапишите тот же tar-файл с остальными файлами.

В GNU tar есть опция --exclude, которая решит эту проблему:

tar cvf ~/app.tar --exclude .git --exclude "*.log" .
49 голосов
/ 21 февраля 2013

Вы можете попробовать напрямую с опцией tar --exclude-vcs:

--exclude-vcs:
          Exclude version control system directories

Например:

tar cvfj nameoffile.tar.bz2 directory/ --exclude-vcs

Работает с Git.

12 голосов
/ 18 июня 2010

Попробуйте что-то вроде этого:

git archive --format=tar -o ~/tarball.tar -v HEAD

Добавьте ваши файлы .log и все остальное, что вы не хотите упаковывать в ваш файл .gitignore.

11 голосов
/ 10 июля 2012

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

tar --exclude-vcs

Это исключит метафайлы svn, git и т. Д.

4 голосов
/ 08 января 2016

В новой версии GNU tar есть возможность автоматически исключать каталоги контроля версий, используя флаг --exclude-vcs.Это позаботится и о .git.

4 голосов
/ 18 июня 2010

[пощечина] Бах!Параметры для поиска были в неправильном порядке!Я не видел предупреждений, потому что они просвистели с экрана.Это позволило "."пройти через egrep, из-за которого tar все испортил.

Это научит меня утопить важные сообщения в многословной отладке.

2 голосов
/ 18 июня 2010

Вы можете сделать это без grep.находка могущественна

 find . -type f -not \( -iname ".git" -or -iname ".log" \) | xargs ...
2 голосов
/ 18 июня 2010

git-archive может быть то, что вы ищете.

1 голос
/ 01 ноября 2012

Для этого из-за пределов каталога приложения:

tar cvfz app.tar.gz --exclude ".git/*" --exclude ".git" app/
0 голосов
/ 19 августа 2017

Для меня содержание .gitignore - это то, что мне нужно:

tar cvfz $PROJECT.tar.gz --exclude-from=$PROJECT/.gitignore $PROJECT

--exclude-from читает содержимое файла - и исключает шаблоны, перечисленные там

...