저장소 내 경로 분리 후 자동으로 동기화 하기
on Git, Github, Github actions
계기
원래는 블로그 전체를 하나의 저장소로 관리했다. 하지만 블로그 설정 파일이 너무 많기도 하고 자주 변경되지 않는 파일들이 많아서 저장소를 분리하기로 했다.
저장소 분리
먼저 기존의 블로그 글 저장소에서 블로그 글이 저장된 경로를 subtree
로 분리했다.
git subtree split -P < 기존 저장소에서 분리한 경로 > -b < 분리할 브랜치 이름 >
블로그 작성을 위한 저장소의 경로를 만들어서 이동한다.
mkdir < 새로운 저장소 경로 >
cd < 새로운 저장소 경로 >
기존의 블로그 글을 분리한 브랜치를 가져온다.
git pull < 기존 저장소 경로 > < 분리할 브랜치 이름 >
GitHub CLI를 이용해 새로운 저장소를 만든다.
gh repo create
? What would you like to do? # 저장소를 만드는 방법을 선택
- Create a new repository on GitHub from scratch # 처음부터 새로운 저장소 만들기
- Create a new repository on GitHub from a template repository # 템플릿 저장소를 이용해 새로운 저장소를 만들기
- Push an existing local repository to GitHub # 이미 로컬에 있는 저장소를 GitHub에 올리기
# 이미 브랜치를 분리해서 저장소를 만들었기 때문에 마지막 옵션을 선택했다.
? Path to local repository # 로컬 저장소의 경로
# 현재 저장소 경로에 들어와 있으므로 . 을 입력했다.
? Repository name # 저장소 이름
# 기본값으로 현재 디렉토리 이름이 입력되어 있어서 그대로 엔터를 눌렀다.
? Repository owner # 저장소 소유자
# 기본값으로 사용자 이름이 입력되어 있어서 마찬가지로 그대로 엔터를 눌렀다.
? Description # 저장소 설명
# 대략적인 설명을 입력했다.
? Visibility # 저장소 공개 여부
- Public # 누구나 볼 수 있음
- Private # 나만 볼 수 있음
- Internal # 내부 사용자만 볼 수 있음
# main 브랜치만 블로그 저장소에서 가져오고 작성 중인 글은 공개되지 않아야 하므로 private로 설정했다.
✓ Created repository < GitHub 사용자 이름 >/< 새로운 저장소 이름 > on GitHub
https://github.com/< GitHub 사용자 이름 >/< 새로운 저장소 이름 >
? Add a remote? # 새로운 저장소에 원격 저장소를 추가할 것인지
- Yes # 원격 저장소를 추가한다.
- No # 원격 저장소를 추가하지 않는다.
# 원격 저장소를 추가할 것이므로 Yes를 선택했다.
? What should the new remote be called? # 새로운 원격 저장소의 이름
# 기본값으로 origin이 입력되어 있어서 그대로 엔터를 눌렀다.
✓ Added remote https://github.com/< GitHub 사용자 이름 >/< 새로운 저장소 이름 >.git
? Would you like to push commits from the current branch to "origin"? # 현재 브랜치의 커밋을 새로운 원격 저장소로 올릴 것인지
- Yes # 커밋을 올린다.
- No # 커밋을 올리지 않는다.
# 이미 로컬 저장소에 기존의 블로그 글을 생성했던 커밋이 있었기 때문에 Yes를 선택했다.
마지막으로 이제 기존 블로그 저장소에서 글이 저장된 경로를 삭제한다.
cd < 기존 저장소 경로 >
git rm -r < 기존 저장소에서 분리한 경로 >
git commit -m "< 경로 제거 커밋 내용 >"
git push origin main
자동 동기화
새로운 저장소에 글을 작성하고 나면 기존의 블로그 저장소에도 동일한 글을 추가해야 한다. 이를 자동으로 동기화하기 위해 GitHub Actions를 이용했다.
GitHub Personal Access Token
먼저 GitHub Personal Access Token을 만들어야 한다. GitHub에 로그인한 상태에서 Settings > Developer settings > Personal access tokens 페이지로 이동한다. Generate new token
버튼을 눌러 새로운 토큰을 만든다. 이때 기존 Classic 토큰과 Fine-grained 토큰을 선택할 수 있다. Classic 토큰에 비해 Fine-grained 토큰은 더 세부적인 권한을 설정할 수 있으므로 후자를 추천한다. Classic 토큰을 선택했다면 repo
권한만 선택하면 되고, Fine-grained 토큰을 선택했다면 기존 블로그 저장소와 새로운 블로그 글 저장소에 대한 권한을 선택하면 된다. 토큰을 생성하고 나면 그 직후에만 토큰을 볼 수 있으므로 토큰을 복사해두자.
GitHub Actions
Secrets
방금 만든 PAT를 GitHub Actions에서 사용할 수 있도록 저장소에 등록해야 한다. 저장소의 Settings > Secrets and variables > Actions 페이지로 이동한다. Repository secrets
의 New repository secret
버튼을 눌러 새로운 비밀값을 만든다. 이름에는 GitHub Actions에서 사용할 이름을, 값에는 방금 복사한 PAT를 입력하면 된다.
Workflow
로컬 저장소의 .github/workflows/pushed.yml
파일을 만들어 다음과 같이 작성했다.
name: Upload Post
on:
push:
branches: [< 새 저장소 브랜치 >]
jobs:
trigger:
runs-on: ubuntu-latest
steps:
- name: Upload Post
run: |
# git 으로 사용할 사용자 정보를 설정한다.
git config --global user.email "< merge commit 에 사용할 이메일 >"
git config --global user.name "< merge commit 에 사용할 사용자 이름 >"
# 기존 블로그 저장소를 가져온다.
git clone https://< GitHub 사용자 이름 >:$@github.com/< GitHub 사용자 이름 >/< 기존 저장소 이름 >.git
cd < 기존 저장소 이름 >
# 새로운 블로그 글 저장소를 원격 저장소로 추가한다.
git remote add < 새 저장소 원격 이름 > https://< GitHub 사용자 이름 >:$@github.com/< GitHub 사용자 이름 >/< 새로운 저장소 이름 >.git
# 새로운 블로그 글 저장소에서 글을 가져온다.
git subtree pull --prefix=< 기존 저장소에서 분리한 경로 > < 새 저장소 원격 이름 > < 새 저장소 브랜치 > -m "< merge commit 내용>"
# 변경된 내용을 원격 저장소로 올린다.
git push origin < 새 저장소 브랜치 >
이제 새로운 글을 작성하고 나면 기존 블로그 저장소에도 자동으로 동일한 글이 추가된다.