Как разместить сайт на Hugo на GitHub user pages
Чтобы разместить сайт на GitHub user pages, нужно, чтобы его содержимое было в ветке master репозитория username.github.io. В идеале, хотелось бы, организовать репозиторий так, чтобы исходный код хранился где-то рядом. Я нагуглила два решения. Отправная точка для обоих — локально работающий сайт, созданный при помощи blogdown в RStudio с темой Academic.
1. Решение на основе поддеревьев
Решение на основе поддеревьев (subtrees) мне показалось более простым, поскольку я не так хорошо понимаю git. Но потом пришлось все переделать, чтобы было аккуратно.
Получится один репозиторий с двумя ветками:
username.github.io:source— исходный код + содержимое папкиpublic;master— веб-версия (только содержимое папкиpublic).
Веб-версия пушится в удаленный репозиторий командой git subtree push.
Основной недостаток этого решения — ветка source содержит содержимое publiс.
В блоге Анатолия (@tolikcode) очень просто описано, как нужно все настраивать. А чтобы немного автоматизировать процесс выгрузки можно использовать скрипт, как предлагает Jente Hidskes. Здесь я кратко законспектирую, что я делала, на случай, если придется повторить.
Настройка
- В директории сайта инициализируем пустой репозиторий git и в его ветку master коммитим что-то неважное. Например, файл
README.md.
git init
git add README.md
git commit -m "initial commit on master"
- Создаем ветку
sourceдля исходного кода (орфан, т.е. без “родителя”). В эту ветку закоммичено все, кроме предварительно удаленной директорииpublic, куда рендерится сайт по-умолчанию.
git checkout --orphan source
rm -rf public ## Удаляет директорию public!!!
git add .
git commit -m "initial commit on source branch"
- Пушим все
git remote add origin git@github.com:username/username.github.io.git
git push origin master
git push origin source
- Подключаем ветку
masterв директориюpublic.
git subtree add --prefix=public git@github.com:username/username.github.io.git master --squash
Работа
- Работаем над сайтом в RStudio. Внесенные изменения можно просмотреть в реальном времени.
blogdown:::serve_site()
Сайт будет сгенерирован в public, но не спешите его в таком виде отправлять на гитхаб: предпросмотр рендерит в т.ч. черновики.
В процессе можно все коммитить как обычно в ветку source, если это долгая работа.
- Генерируем веб-версию.
Предварительно нужно остановить живое превью, перезагрузив R сессию или servr::daemon_stop("номер, выданный blogdown:::serve_site()").
blogdown::hugo_build()
В консоли коммитим окончательные изменения.
git add -A
git commit -m "update"
git push origin source
- Публикуем измененный сайт в
masterпри помощиsubtree push.
git subtree push --prefix=public https://github.com/tolikcode/tolikcode.github.io.git master
После этого сайт будет доступен на GitHub user pages http://username.github.io/.
2. Решение на основе подмодулей (submodules)
Решение на основе подмодулей (submodules) описано в документации Hugo. Сначала я не поняла как его развернуть. Но после этого видео про подмодули все поняла и сделала именно так.
Получится два репозитория:
-
username-src:master— исходный код.
-
username.github.io:master— веб-версия (только содержимое папкиpublic). Этот репозиторий подключен в виде submodule в папкуpublicрепозиторияusername-src.
Достоинство этого решения — отдельная чистая история для исходного кода и сайта.
Для автоматизации веб-версия пушится в удаленный репозиторий скриптом deploy.sh.
Настройка
- В директории проекта генерируем сайт.
hugo -t hugo-academic # Если используете тему, замените на `hugo -t <YOURTHEME>`
- В под-директории
publicсоздаем репозиторий для веб-версии. Пушим все изменения.
cd public
git init
git remote add origin git@github.com:username/username.github.io.git
git add .
git commit -m "initial commit of website"
git push -u origin master
- Возвращаемся в директорию проекта и удаляем под-директорию
public.
cd ..
rm -rf public
- В директории проекта инициализируем репозиторий git. Добавляем
publicв.gitignore.
git init
git remote add origin git@github.com:username/username-src.git
echo "public" >> .gitignore
git add .
git commit -m "initial commit of source code"
git push -u origin master
- Подключаем репозиторий с веб-версией в директорию
publicв качестве подмодуля.
git submodule add -b master git@github.com varmara/varmara.github.io.git
git add .
git commit -m 'added public as a submodule'
git push origin master
Работа
- Работаем над сайтом в RStudio. Внесенные изменения можно просмотреть в реальном времени.
blogdown:::serve_site()
Сайт будет сгенерирован в public, но не спешите его в таком виде отправлять на гитхаб: предпросмотр рендерит в т.ч. черновики.
Изменения спокойно коммитим в репозиторий с исходным кодом username-src.
- Когда приходит время, генерируем веб-версию.
Останавливаем живое превью, перезагрузив R сессию или servr::daemon_stop("номер, выданный blogdown:::serve_site()"). Затем, запускаем скрипт deploy.sh, который сам удаляет устаревшее содержимое public, генерирует сайт и коммитит его в username.github.io.
#!/bin/bash
# a script for easy site deploymend from submodule
# make it executable with chmod +x deploy.sh
# Set the English locale for the `date` command.
export LC_TIME=en_US.UTF-8
# The commit message.
MESSAGE="Site rebuild $(date)"
echo -e "\033[0;32mDeploying updates to GitHub...\033[0m"
# Remove old files in public
pushd public
git rm -rf *
popd
# Build the project.
hugo -t hugo-academic # if using a theme, replace with `hugo -t <YOURTHEME>`
# Go To Public folder
cd public
# Add changes to git.
git add .
# Commit changes.
msg="rebuilding site `date`"
if [ $# -eq 1 ]
then MESSAGE="$1"
fi
git commit -m "$MESSAGE"
# Push source and build repos.
git push origin master
# Come Back up to the Project Root
cd ..
Теперь обновленный сайт доступен на GitHub user pages http://username.github.io/.