Как я могу использовать git -archive для включения подмодулей из голого репозитория
Я запускаю развертывание script. Основной процесс:
- Нажмите изменения в голый репозиторий на сервере
- Затем на основе новых тегов будет создана новая папка для выпуска.
- Используйте git архив для перемещения файлов в каталог выпуска
- Запускает некоторые сценарии миграции и помещает его в живое (если все успешно).
Проблема заключается в том, что мой репозиторий содержит подмодуль, который не попадает в архив и поэтому не попадает в каталог выпуска.
Я видел git-archive-all, но это не работает в голом репозитории.
Если это невозможно, я рассматриваю,
- сделать репозиторий открытым и обновить рабочую копию, которая позволит мне использовать git -archive-all. Или
- имея второй голый репозиторий подмодуля на сервере, из которого я мог бы получить архив (нужно было бы изучить это, чтобы убедиться, что я получаю правильную ревизию).
Ответы
Ответ 1
Если ваш подмодуль находится в репо, доступном с сервера, я бы предпочел использовать крюк post-receive, который будет
- обновить полное не-обнаженное репо (так что второе репо рядом с вашим оригинальным голосом), включая подмодуль (
git submodule update --init
)
-
git archive
из этого второго репо (вы обязательно получите правильную версию, так как не-голый репо будет ссылаться на правильную версию подмодуля)
Поскольку непокрытое репо будет содержать родительское репо и его подмодули, git archive-all
сможет обнаружить подкаталоги .git
и будет архивировать все.
Если подмодуль недоступен с сервера, это означает:
- его нужно перенаправить на свое собственное репо на сервере
- подмодуль в родительском репо должен быть ссылкой с относительным путем, чтобы родительское репо все еще могло получать указанный подмодуль после того, как он был нажат на сервер.
Ответ 2
Это должно сделать трюк: https://github.com/meitar/git-archive-all.sh/wiki
Ответ 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.