git subtree 커맨드를 이용하여 hugo 정적 사이트 저장소를 github에서 관리하는 방법을 정리한다.

개인적으로 필요한 요구사항

  • 생성된 정적 사이트만 public 저장소에 노출한다.
    • md파일 이나 hugo의 설정 등은 노출하지 않는다.
  • git을 사용하면서 커맨드가 너무 복잡하지 않아야 한다.
  • theme의 업데이트를 편리하게 따라 갈수 있어야 한다.

저장소 구성

  • 메인 저장소 : root 저장소, private으로 유지
  • 사이트 저장소 : hugo로 생성된 사이트 저장수, public으로 유지(무료사용자), github.io로 서빙
  • 테마 저장소 : 다른사람이 만든 테마 저장소, 가져다가 쓰는 용도

디렉토리 구성

root              // 메인 저장소
├─ archetypes
├─ content
├─ static
├─ ...            // 여기까지는 hugo new site로 생성된 기본 디렉토리들
├─ public         // 사이트 저장소 : hugo 커맨드로 생성된 사이트
└─ themes
   └─ hugo-tranquilpeak-theme // 테마 저장소 : tranquilpeak를 예제로 사용

순서대로 저장소 구성해 보기

hugo 사이트 생성, git 초기화

# hugo 사이트 생성
$ hugo new site my_site
Congratulations! Your new Hugo site is created in /Users/naver/my_site.
...
$ cd my_site && ll
total 8
drwxr-xr-x  3 user  user  96 12 12 13:22 archetypes
-rw-r--r--  1 user  user  82 12 12 13:22 config.toml
drwxr-xr-x  2 user  user  64 12 12 13:22 content
drwxr-xr-x  2 user  user  64 12 12 13:22 data
drwxr-xr-x  2 user  user  64 12 12 13:22 layouts
drwxr-xr-x  2 user  user  64 12 12 13:22 static
drwxr-xr-x  2 user  user  64 12 12 13:22 themes

# git 초기화
$ git init
Initialized empty Git repository in /my/dir/my_site/.git/

테마 설정

원하는 테마를 메인 저장소의 theme 하위에 subtree 커맨드로 추가 해준다.

tranquilpeak 테마를 예제로 사용

# 테마 저장소를 리모트로 추가
git remote add hugo-tranquilpeak-theme https://github.com/kakawait/hugo-tranquilpeak-theme.git

# themes/hugo-tranquilpeak-theme 디렉토리에
# hugo-tranquilpeak-theme 리모트의
# 0.4.7-BETA 태그를 받아서 추가
git subtree add --prefix themes/hugo-tranquilpeak-theme hugo-tranquilpeak-theme 0.4.7-BETA

실제 테마를 적용하기 위해서는 config.toml을 수정해 줘야 한다.

# config.toml에 추가
theme = "hugo-tranquilpeak-theme"

사이트 저장소 설정

먼저 자신의 github 계정에 ${username}.github.io 저장소 이름을 생성해야 한다.(github pages로 올리기 위함) 그리고 아래의 커맨드로 메인 저장소의 pulic 디렉토리를 위의 서빙 저장소로 지정해준다.

# 서빙 저장소를 리모트로 추가
git remote add github-pages https://github.com/${username}/${username}.github.io.git

# public 디렉토리에
# github-pages 리모트의
# master 태그를 받아서 추가
git subtree add --prefix public github-pages master

github pages로 변경사항 반영하기

# hugo 빌드
$ hugo 
                   | KO-KR  
+------------------+-------+
  Pages            |    39  
  Paginator pages  |     0  
...

# 메인 저장소에 커밋, push
$ git commit -am "commit changes"
$ git push origin master # github pages에 반영하는것과는 별개

# 서빙 저장소에 public 디렉토리 push
$ git subtree push --prefix public github-pages master

결론

위 방식으로 서빙 저장소와 메인 저장소를 분리하고 메인 저장소를 private으로 유지할 수 있다. 또한 테마가 업데이트 될때는 다시 push 받으면 최신판 유지가 가능하다.

submodule로도 유사한 방식으로 저장소를 분리할수 있지만 개인적인 느낌으로는 subtree가 더 간편하고 깔끔하게 유지되는 느낌이 든다.