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

Как я могу использовать git -archive для включения подмодулей из голого репозитория

Я запускаю развертывание script. Основной процесс:

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

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

Я видел git-archive-all, но это не работает в голом репозитории.

Если это невозможно, я рассматриваю,

  • сделать репозиторий открытым и обновить рабочую копию, которая позволит мне использовать git -archive-all. Или
  • имея второй голый репозиторий подмодуля на сервере, из которого я мог бы получить архив (нужно было бы изучить это, чтобы убедиться, что я получаю правильную ревизию).
4b9b3361

Ответ 1

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

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

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

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

Ответ 3

Здесь это как несколько строк:

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" --

Ответ 4

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

pip install git-archive-all

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

Ответ 5

Выполните следующее после обычной команды архива:
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.