지킬 블로그 테마와 포스트를 따로 관리하기

2017-10-09

Git으로 프로젝트 속 프로젝트를 관리하는 방법으로는 submodule과 subtree이 있다. 나는 subtree를 선택했는데, 비공개 원격저장소는 submodule로 사용할 수 없기 때문이다. 1

블로그에서 포스트 떼어내기2

먼저 깃헙에서 포스트만 저장할 새 리포지토리를 만들고, remote 리포지토리로 등록한다.

$ git remote add posts https://github.com/<your-name>/<your-new-repo>.git

subtree split 으로 기존의 블로그에서 _posts 폴더를 독립시킨다. --prefix 옵션은 분리할 디렉토리(여기서는 _posts 폴더)의 경로이고 -b 옵션은 subtree 브랜치 이름이다.

$ git subtree split --prefix=_posts/ -b posts

그리고 아까 만든 post 리포지토리의 master 브랜치에 subtree 브랜치를 push 하고 이후에 트랙킹할 수 있도록 업스트림으로 지정해준다.

$ git subtree push --prefix=_posts/ posts master
$ git branch --set-upstream-to=posts/master posts

깃 훅을 사용한 포스트 업데이트

이제 포스트를 블로그 코드와 다른 원격저장소에서 관리할 수 있게 되었다. 그러나 포스트가 수정되더라도 블로그가 저절로 업데이트 되지는 않아서 수동으로 업데이트를 해주어야 한다.

$ git fetch posts
From https://github.com/<your-name>/<your-new-repo>
 + 5f4c2cf...8343641 master     -> posts/master

$ git merge --squash -s subtree --no-commit posts/master  # 에러
fatal: refusing to merge unrelated histories

$ git merge --squash -s subtree --no-commit posts/master --allow-unrelated-histories
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested

우리는 이것마저 귀찮으니 Git hook 기능3을 써서 반자동화 해보도록 하자.

.git/hooks/ 를 열어보면 여러 .sample 파일들이 있다. post-checkout 파일에 스크립트를 써두면, 모든 git checkout 명령 후에 이 스크립트가 자동으로 실행된다.

$ touch post-checkout
$ chmod 755 post-checkout
.git/hooks/post-checkout
#!/bin/bash
BRANCH=$(git rev-parse --abbrev-ref HEAD)
DATE=$(date '+%F %T')

if [ "$BRANCH" = "master" ]; then
    git merge -s subtree posts --allow-unrelated-histories
    git commit -m "Update posts at $DATE"
elif [ "$BRANCH" = "posts" ]; then
    git pull -s subtree posts master --no-commit --no-ff
    git commit -m "Update posts at $DATE"
fi

이렇게 해두고 포스트를 업데이트 하고 싶을때 $ git checkout post -> $ git checkout master 를 실행하면 된다.

개인적인 생각

사실 이렇게 할 필요는 거의 없지 않을까 싶다. 블로그 코드와 포스트를 분리하면서 기대할 수 있는 효과는:

  1. 블로그 레이아웃의 코드 변경과 글 내용의 수정은 성격이 다르니 이를 분리해서 관리하면 로그가 더 깔끔할 것이다.
  2. 지킬 테마를 다른 것으로 바꿀 때 포스트 마이그레이션이 더 편리할 것이다.

인데, 이를 반박하자면

  1. 절차만 늘어났다. 심지어 지금 쓰고있는 테마처럼 jekyll-now 를 기반으로 한 블로그는 커맨드라인을 전혀 쓰지 않고도 블로그 관리가 가능해서 굳이 로그를 관리할 필요가 없다.
  2. 마이그레이션은 그냥 _posts, _config.yml, about.md 만 떼어냈다 붙이면 되는데..

그래도 subtreeGit Hook 에 대해 알아보는 계기가 되었으니 헛 삽질은 아니었던걸로.