Skip to main content Link Menu Expand (external link) Document Search Copy Copied

포스트 & 테마 분리

레포지토리에서 포스트와 테마를 분리하기


하나의 레포지토리에서 Jekyll 테마와 포스트를 같이 관리하면서 여러 문제점을 맞닥뜨렸다.


commit 그래프가 점점 지저분해졌다.

포스트가 늘어남에 따라 점점 커밋이 많아졌다. 너무 많아졌다. 테마 수정과 관련된 커밋과 포스트 관련 커밋들이 섞이며 커밋 그래프도 지저분해지기 시작했다.

커밋 메시지를 작성할 때, Conventional Commit을 지키며 scope에 _posts, _config, _layouts 등을 명시해가며 이 문제를 해결하기 위해 노력하였다.

하지만, 해결하지 못한 또 다른 문제가 있었다.

비공개 포스트는 사실 숨겨진게 아니다.

레포지토리를 공개로 해두면 다음과 같은 문제가 있다.

  • 비공개 포스트를 작성하고 싶을 때, unpublished: ture로 해두어도 레포지토리에서 열람이 가능하다.
  • 삭제한 문서도 commit history를 통해 조회가 가능하다.

그렇다고 레포지토리를 비공개로 전환하면 Issue / PR / Fork / Star 등의 GitHub 서비스를 이용하기 어려워진다. 특히 Issue 기능을 이용하는 댓글 서비스Utterances를 사용할 수 없게 되어 곤란하다.


유연한 관리를 위해 포스트와 테마를 레포지토리에서 분리하기로 결심했다.


포스트 분리

Jekyll에서 포스트는 기본적으로 _posts/ 디렉터리에서 관리한다. 이 _posts/ 에서 작성하는 커밋을 분리하고 숨겨버리면 문제들은 모두 해결된다.

그럼 이제 _posts/ 부터 완전히 분리해보자.

레포지토리 분리

레포지토리는 다음과 같이 구분할 것이다:

  • GitHub Pages 레포지토리: Hepheir/hepheir.github.io (master 브랜치에서 관리)
  • 포스트 레포지토리: Hepheir/hepheir.github.io-posts

1. GitHub에서 포스트를 보관하기 위한 private 레포지토리를 생성한 뒤, url을 복사했다.

https://github.com/Hepheir/hepheir.github.io-posts

2. hepheir.github.io의 모든 커밋을 hepheir.github.io-posts로 복사하였다.

# 포스트 레포지토리로 이동
$ cd hepheir.github.io-posts

$ git init
$ git remote add "https://github.com/Hepheir/hepheir.github.io-posts" origin
$ git remote add "https://github.com/Hepheir/hepheir.github.io" upstream
$ git pull upstream master
$ git push origin master
$ git remote remove upstream

3. hepheir.github.io-posts에서 git rebase를 통해 포스트와 관련된 커밋만을 남기고 모두 drop 시킨다.

$ git rebase --committer-date-is-author-date -i `(git rev-list --max-parents=0 HEAD)`
  • --committer-date-is-author-date: 기존 커밋의 작성 시각을 유지하도록 하기위해 추가한 옵션이다.
  • -i (--interactive): 남겨야 할 커밋을 직접 보고 고르기 위해 추가한 옵션이다.
  • `(git rev-list --max-parents=0 HEAD)`: git rev-list --max-parents=0 HEAD 명령은 첫 번째 커밋의 해쉬를 가져오고, 그 결과를 `( )`로 묶어 인자로 전달한다.

4. hepheir.github.io에서도 3번과 동일한 작업을 수행한다. 단, 포스트와 관련된 커밋만 모두 drop 시킨다.


포스트 레포지토리의 분리가 끝났다. 이어서 분리한 레포지토리를 기존 레포지토리의 _posts/ 경로로 연결해 주어야 한다.


분리한 레포지토리를 서브 모듈에 추가

git submodule add <repository> [<path>] 명령을 이용하여 추가한다.

# 페이지 레포지토리로 이동
$ cd hepheir.github.io

$ git submodule add "https://github.com/Hepheir/hepheir.github.io-posts" "_posts"
$ git submodule init
$ git submodule update

git submodule 사용법은 다음 문서를 참고했다. https://git-scm.com/book/ko/v2/Git-도구-서브모듈


이로서 포스트를 별개의 레포지토리로 분리하는데 성공했다.

앞으로 비공개 포스트는 외부에 노출될 일이 없어졌으며, 커밋 그래프는 테마와 관련된 커밋들로 구성될 것이다.

그러나 이번엔 새로운 문제가 발생했다 - GitHub Pages의 자동 빌드/배포 기능이 더 이상 제대로 동작하지 않는다.

앞으로는 수동으로 정적 사이트를 빌드하고 배포해야 하는걸까.


Table of contents


Back to top