Чистая система для страниц github с локальными плагинами - PullRequest
3 голосов
/ 01 июня 2011

Поскольку github не выполняет плагины (опция safe для jekyll), я пытаюсь разработать небольшой и простой способ развертывания скомпилированных файлов в ветке master.

Обычный источник находится в ветке boilerplate, оттуда я запускаю jekyll и генерирую код, все работает.

В основной ветке у меня есть только следующее Makefile

default:
    git checkout boilerplate
    git subtree split -P _site -b site
    git checkout master
    git merge -X theirs site
    git branch -D site

и файл .nojekyll (я использую команду поддерева из здесь )

Однако это не работает. Он генерирует ветку site со всем кодом, но когда я сливаюсь в master, все, что он говорит, это:

Уже обновлено.

Как это исправить?

Что я хочу сделать, это перезаписать любые существующие файлы в master НО не удалять файлы, которые не существуют в ветви site (например, вышеупомянутые Makefile и .nojekyll, что важно для хранится там).

Примечание : Я хочу сделать это с нуля, чтобы сохранить контроль над процессом развертывания. Я не хочу 1. вводить новые зависимости 2. использовать другие инструменты.

1 Ответ

15 голосов
/ 01 июня 2011

Как я сказал в IRC, я бы пошел с git hook (git help hooks)

Я взломал скрипт this очень быстро.Поместите его в $GIT_DIR/.git/hooks/.

. Я проверил это как хук после фиксации , отправляющий из $_origbranch, и проверил результаты в другой ветви ($_destbranch).

Он должен делать то, что вы хотите.Сработало нормально, так что я надеюсь, что оно подходит вам или направляет это в несколько правильном направлении.

#!/usr/bin/env bash

# executables prefix
_prefix="/usr/bin"
# git executable
_git="$_prefix/git"

# site generation executable
_generate="$_prefix/jekyll"
# options for the generator
_opts=(--no-safe --no-server --no-auto --kramdown)

# branch from which to generate site
_origbranch="master"
# branch holding the generated site
_destbranch="gh-pages"

# directory holding the generated site -- should be outside this repo
_site="$("$_prefix/mktemp" -d /tmp/_site.XXXXXXXXX)"
# the current branch
_currbranch="$(/bin/grep "^*" < <("$_git" branch) | /bin/cut -d' ' -f2)"

if [[ $_currbranch == $_origbranch ]]; then # we should generate the site
    # go to root dir of the repo
    cd "$("$_git" rev-parse --show-toplevel)"
    # generate the site
    "$_generate" ${_opts[@]} . "$_site"
    # switch to branch the site will be stored
    "$_git" checkout "$_destbranch"
    # overwrite existing files
    builtin shopt -s dotglob
    /bin/cp -rf "$_site"/* .
    builtin shopt -u dotglob
    # add any new files
    "$_git" add .
    # commit all changes with a default message
    "$_git" commit -a -m "updated site @ $(date +"%F %T")"
    # cleanup
    /bin/rm -rfv "$_site"
    # return
    "$_git" checkout "$_origbranch"
fi

весело провести время o /


Просто обновление, чтобы сказать, что это работает с Bash и Linux.Это может быть написано и в POSIX sh.Кроме того, я считаю, что mktemp - это только GNU-coreutils, поэтому другие системы, возможно, должны заменить это.

ПРИМЕЧАНИЕ: это работает только тогда, когда вы фиксируете в ветке, указанной в $_origbranch.Вы можете изменить это.Я считаю, что это достаточно просто для всех.

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