Тарболинг без метаданных Git
В моем исходном дереве содержится несколько каталогов, в которых используется элемент управления Git, и мне нужно архивировать все дерево, исключая любые ссылки на метаданные Git или пользовательские файлы журналов.
Я подумал, что мне нужно будет использовать комбинацию find/egrep/xargs/tar, но каким-то образом tar файл содержит каталоги .git и файлы *.log.
Это то, что у меня есть:
find -type f . | egrep -v '\.git|\.log' | xargs tar rvf ~/app.tar
Может кто-нибудь объяснить мое недоразумение здесь? Почему tar обрабатывает файлы, которые находят и egrep фильтруют?
Я также открыт для других методов.
Ответы
Ответ 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 шаблоны, перечисленные там