Мне очень нравится markdown. И мне очень бы хотелось писать статьи именно в нём, в своём удобном редакторе кода. На данный момент этот редактор PhpStorm + IdeaVim. Хранения статей в репозитории на Github тоже очень комфортная вещь. Поэтому в качестве движка блога я выбрал Jekyll, раз его предлагает использовать Github Pages. Хотя Ruby и не нативный язык для моих проектов, для меня это не является минусом при выборе.

Знакомство с Jekyll прошло довольно быстро. И я остался доволен. За исключением одного момента - это плагины, которые Github Pages не поддерживают. Эти плагины будут игнорироваться при сборке сайта с директивой –safe.

А хочется хранить в репозитории только исходники сайта.

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

Тут предлагается иметь две ветки в репозитории: source и master. Github Pages использует master для отображения сайта на *.github.io, а ветку source можно установить по умолчанию в настройках репозитория на github.com .

Для удобства работы с двумя ветками предлагается использовать скрипт, который переносит собранный сайт в ветку master и отправляет изменения на сервер. Команд из приведённого примера мне показалось недостаточно, поэтому я немного его расширил. Примечание: я работаю в окружении Windows.

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

Запускаю скрипт git-publish-io.bat.

:: Собирает наш сайт
call jekyll build 

:: Удяляет ветку master
git branch -D master

:: Создает и разворачивает новую ветку master
git checkout -b master

:: Те файлы, которые не находятся под управлением git в ветке source теперь добавляются в индекс
git add _site/*

:: Выполняется commit
git commit -m "auto commit by git-publish-io"

:: Переносит корень репозитория в папку собранного сайта
git filter-branch --subdirectory-filter _site/ -f

:: Удяляет из индекса ветки master bat-файл. Если этот файл не коммитить выше, то после filter-branch он пропадёт и выполнение скрипта прервётся
git rm -rf --cached git-publish-io.bat

:: Выполняет commit без bat-файла. 
git commit -m "auto commit by git-publish-io. Remove bat file from master"

:: Возврящает рабочую копию в ветку source
git checkout -f source

:: Удаляет ветку master на Github
git push origin --delete master

:: Выполнят push всех веток на Github
git push --all origin

Таким образом на Github по умолчанию для проекта *.github.io будут видны только исходники проекта. А в ветке master всегда будут только 2 коммита с текущим состоянием собранного сайта.