Как получить эффект --strip-components GNU tar с помощью git-archive? - PullRequest
3 голосов
/ 02 февраля 2011

В общих чертах, я хотел бы получить прямое преобразование tar-to-tar, в котором корень результата содержит только определенное поддерево каталога оригинала.

Чтобы проиллюстрировать это на примере, скажем, я хочу только каталог gitweb из репозитория git. Запуск

$ git archive --prefix=git-gitweb/ master gitweb | tar tf -

дает

git-gitweb/
git-gitweb/gitweb/
git-gitweb/gitweb/INSTALL
git-gitweb/gitweb/Makefile
git-gitweb/gitweb/README
git-gitweb/gitweb/gitweb.perl
git-gitweb/gitweb/static/
git-gitweb/gitweb/static/git-favicon.png
git-gitweb/gitweb/static/git-logo.png
git-gitweb/gitweb/static/gitweb.css
git-gitweb/gitweb/static/gitweb.js

но я хочу

git-gitweb/
git-gitweb/INSTALL
git-gitweb/Makefile
git-gitweb/...

В руководстве предусмотрены дополнительные специфичные для бэкенда опции, но попытка передать --strip-components приводит к ошибке:

$ git archive --prefix=git-gitweb/ --strip-components=1 master gitweb | \
  tar tf -
error: unknown option `strip-components=1'
usage: git archive [options]  [...] ...

Бэкэнд tar не является GNU tar в любом случае.

Кто-то на канале #gnu freenode предложил Tardy , но он не понимает вывод git-archive :

$ git archive master > old.tar
$ tardy old.tar new.tar
tardy: old.tar: file type ``g'' unknown

Да, я могу извлечь вывод git-archive с помощью --strip-components и создать новый архив результата, но я пытаюсь избежать использования файловой системы в качестве временной переменной.

1 Ответ

8 голосов
/ 02 февраля 2011

Архивируйте этот каталог как CWD, и у вас не будет дополнительного компонента пути:

(cd gitweb; git archive --prefix=git-gitweb/ master .) | tar tf -

Или используйте этот синтаксис в соответствии с рекомендациями справочной страницы git-archive:

git archive --prefix=git-gitweb/ master:gitweb | tar tf -
...