Подтвердить что ты не робот

Тарболинг без метаданных Git

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

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

Это то, что у меня есть:

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

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

Я также открыт для других методов.

4b9b3361

Ответ 1

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

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

tar cvf ~/app.tar --exclude .git --exclude "*.log" .

Ответ 2

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

--exclude-vcs:
          Exclude version control system directories

Например:

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

Работает с Git.

Ответ 3

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

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

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

Ответ 4

Чтобы исключить каталоги системы управления версиями:

tar --exclude-vcs

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

Ответ 5

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

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

Это работает:

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

Ответ 6

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

Ответ 7

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

Ответ 8

Вы можете сделать это без grep. найти мощный

 find . -type f -not \( -iname ".git" -or -iname ".log" \) | xargs ...

Ответ 9

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

tar cvfz app.tar.gz --exclude ".git/*" --exclude ".git" app/

Ответ 10

Для меня контент .gitignore - это то, что мне нужно:

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

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