Как я могу использовать git-архив для включения подмодулей из чистого репозитория - PullRequest
18 голосов
/ 30 марта 2011

Я в процессе настройки сценария развертывания.Базовый процесс:

  1. Перенос изменений в пустой репозиторий на сервере
  2. Затем на основе новых тегов будет создана новая папка для выпуска.
  3. Использование архива git для перемещения файлов в каталог выпуска
  4. Запускает некоторые сценарии миграции и запускает их (если все прошло успешно).

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

Я видел git-archive-all , ноэто не работает в пустом хранилище.

Если это невозможно, я подумываю,

  1. сделать хранилище не пустым и обновить рабочую копию, что позволитмне использовать git-archive-all.Или
  2. со вторым пустым хранилищем подмодуля на сервере, с которого я мог бы получить архив (пришлось бы изучить это, чтобы убедиться, что я получаю правильную ревизию).

Ответы [ 5 ]

3 голосов
/ 18 ноября 2016

Я использую этот пакет Python https://github.com/Kentzo/git-archive-all. Вы можете установить его с помощью

pip install git-archive-all

В OSX вы можете установить его также с помощью brew install git-archive-all

2 голосов
/ 30 марта 2011

Если ваш подмодуль находится в репо, доступном с сервера, я бы предпочел хук пост-получения, который бы

  • обновить полное не-голое репо (так что второе репо рядом с вашим оригинальным репо), включая подмодуль (git submodule update --init)
  • git archive из этого второго репо (вы наверняка получите правильную версию, так как репозиторий non-bare будет ссылаться на правильную версию субмодуля)
    Поскольку репозиторий non-bare будет содержать родительский репозиторий и его подмодулей, git archive-all сможет обнаруживать подкаталоги .git и будет архивировать все .

Если субмодуль недоступен с сервера, это означает:

  • его нужно отправить в свое собственное хранилище на сервере
  • Подмодуль в родительском репо должен иметь ссылку с относительным путем, чтобы родительский репозиторий все еще мог получить указанный подмодуль после отправки на сервер.
1 голос
/ 16 октября 2012

Вот это как несколько лайнеров:

prefix=$(basename "$(pwd -P)")
{
  git ls-files
  git submodule foreach --recursive --quiet \
                'git ls-files --with-tree="$sha1" | sed "s#^#$path/#"'
} | sed "s#^#$prefix/#" | xargs tar -c -C.. -f "$prefix.tar.xz" --
1 голос
/ 23 августа 2012

Это должно сработать: https://github.com/meitar/git-archive-all.sh/wiki

0 голосов
/ 30 мая 2013

После обычной команды архивирования выполните следующее:
git submodule foreach 'cd REPO_ROOT/$path && git archive HEAD | tar -x -C TARGET_ROOT/$path'

Здесь REPO_ROOT - это место, где находится ваше репо, а TARGET_ROOT - место, где вы положили свою архивную версию. (Я предполагаю, что у вас есть папка TARGET_ROOT, в которой развернутая версия первого git archive вызова. Если вам нужен последний zip / tar, вы можете tar / zip конечную папку)

git submodule foreach предоставляет переменную $path. Подробнее см. Раздел git help submodule foreach.

...