1. 개요

문득, 임시글과 글을 블로그 리파지토리로부터 별도의 리파지토리로 분리하면 좋겠다는 생각이 들었다. 이유는 크게 두 가지가 있다.

  1. 임시글은 초안이나 메모를 가볍게 작성해두는 곳이므로 다른 사람들에게 공개할 필요가 없다.
  2. 블로그의 소스코드 히스토리와 임시글/글의 히스토리를 분리하고 싶다.

하지만 임시글과 글 모두 프로젝트 내에 각각 drafts/, posts/ 디렉토리 안에 존재해야 하므로, 단순히 리파지토리를 분리하는 것만으로는 근본적인 해결책이 될 수 없다. 그래서 우리는 git 의 서브모듈submodule 기능을 사용해 리파지토리를 분리하려고 한다.

공식 문서에서는 서브모듈에 대해 아래와 같이 설명하고 있다.

Git 저장소 안에 다른 Git 저장소를 디렉토리로 분리해 넣는 것이 서브모듈이다. 다른 독립된 Git 저장소를 Clone 해서 내 Git 저장소 안에 포함할 수 있으며 각 저장소의 커밋은 독립적으로 관리한다.

즉, 서브모듈 기능을 사용해 임시글/글을 위한 별도 리파지토리를 각각 만들어서 블로그 리파지토리 (ricale/blog) 의 서브 디렉토리로 관리하겠다는 이야기다.

2. 적용

일단은 서브모듈로 사용될 리파지토리를 만들자. (나는 임시글과 글 각각을 위해 ricale/blog-drafts, ricale/blog-posts 리파지토리를 비공개로 만들었다.)

그리고 해당 리파지토리들에 임시글/글 파일들(drafts/, posts/ 디렉토리의 파일들)을 고스란히 옮기자.

다 옮겼으면 본래의 블로그 리파지토리로 돌아와서, 기존 drafts/, posts/ 디렉토리를 삭제한 뒤 커밋을 한 번 하자.

(여기서 커밋을 하지 않으면 drafts/, posts/ 디렉토리가 리파지토리 내에 존재하는 것으로 여겨져서 해당 디렉토리에 서브모듈을 적용할 수 없다.)

그리고 아래 명령어를 실행하자.

git submodule add --force git@github.com:ricale/blog-drafts.git ./drafts
git submodule add --force git@github.com:ricale/blog-posts.git ./posts

여기서 --force 옵션을 붙인 이유는, 붙이지 않았을 경우 아래와 같은 에러가 발생했기 때문이다.

A git directory for 'drafts' is found locally with remote(s):
  origin        git@github.com:~
If you want to reuse this local git directory instead of cloning again from
  git@github.com:~
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

그러면 이제 아래 파일들이 새로이 추가된 것을 확인할 수 있다.

.gitmodules
drafts/
posts/

drafts/posts/ 디렉토리에 들어가서 git status 등 git 명령어를 쳐보면 상위 디렉토리와는 별개의 리파지토리(ricale/blog-drafts, ricale/blog-posts)로 관리되고 있음을 확인할 수 있다. 해당 디렉토리들에서 글을 추가하고, 필요할 때는 각자 커밋 및 푸시를 진행할 수 있다. 상위 디렉토리의 리파지토리에서는 drafts/, posts/ 를 하나의 파일 같이 인식하기 때문에 디렉토리 내부의 변경 사항에는 신경쓰지 않는다.

위에서 언급한 세 파일은 git 에 추가해서 관리하자. 이제 블로그 리파지토리를 GitHub 에서 확인해보면 drafts/posts/ 가 별도의 리파지토리로 분리된 것을 확인할 수 있다.

3. 결과

이제 임시글/글 들을 블로그 리파지토리와 별개의 리파지토리로 관리할 수 있다.

위의 과정만 거쳐도 블로그를 관리하는 데에는 충분하지만, 서브모듈에 대해 더 알고 싶다면 (git submodule 로 시작하는 관련 명령어가 많다.) 공식 문서를 참고하자.

4. 참고