Git Submodule은 메인 레포지토리의 자식 레포지토리를 생성하여 관리하는 도구이다.
배포 과정에서 yml파일과 같은 민감 정보가 들어있는 파일들을 숨기기 위해 사용하려고 한다.
private 레포지토리를 생성한다. 나는 팀 레포 내부에 추가했다.
여기에 application-dev.yml
, application.yml
, application-datasource.yml
을 생성했다.
application.yml
: dev(개발환경), prod(배포환경) yml을 설정하여 사용하기 위한 설정 파일application-dev.yml
: 개발 환경에서 사용할 yml 설정 파일application-prod.yml
: 배포 환경에서 사용할 yml 설정 파일 -> 추후 추가할 예정application-datasource.yml
: 데이터베이스 관련 yml 설정 파일명령어를 이용하여 메인 레포지토리에 submodule을 추가한다.
git submodule add {submodule_repository_url}
서브모듈을 추가하면 .gitmodules
파일이 추가되는데,
[submodule "security"]
path = security
url = git@github.com:{부모레포}/{서브모듈레포}.git
위와 같은 형태이다. 이를 추가한 후 메인 레포에 push까지 해야 최종적으로 반영된다.
# .gitmodules, submodule의 레포 이름이 생겼는지 확인하기
git status
git add .
git commit -m "{message}"
git push {부모레포} {브랜치명}
git submodule update --remote
주의할 점은 부모 레포에 적용을 위해서는 아래 명령어를 사용하여 적용해주어야 한다.
git submodule foreach git pull
git add .
git commit
git push
우선 프로젝트를 클론한다.
git clone {레포주소}
submodule을 초기화하고 업데이트한다. 이는 처음 한 번만 수행한다.
git submodule init
git submodule update
한 번에 처리하는 방법
git clone --recurse-submodules {레포주소}
submodule의 업데이트를 가져와야 하는 경우
git submodule update --remote --merge
processResources.dependsOn('copySecret')
tasks.register('copySecret', Copy) {
from './security'
include '*.yml'
into 'src/main/resources'
}
from: submodule의 위치
include: 복사할 파일
into: 복사할 위치
worksflow/gradle.yml에 아래의 내용을 추가하여야 한다.
- name: Checkout
uses: actions/checkout@v1
with:
token: ${{ secrets.ACTION_TOKEN }}
submodules: true
profile
- settings
- Personal access tokens
- Tokens
에서 token을 발급받아 Secret에 추가해준다.
remote error: upload-pack: not our ref c6f1374ceeb49e14e78f0ca500a7
이러한 오류가 떴는데, 서브 모듈의 HEAD가 Detached 상태에서 업로드를 해서 그런 것 같다. 그래서 branch를 설정하고 push를 하라는 내용들이 많았다.
부모 폴더에서 아래 명령어를 사용하면
git submodule update
git submodule foreach git checkout main
서브모듈의 branch가 메인을 향하게 되는 것 같다
git submodule update --remote --merge
git add
git commit -m
git push origin
위 순서대로 명령어를 사용하니 잘 반영이 됐다.
= 1번은 체크를 안해봐서 필요여부를 모르겠음 =
나중에 같은 상황이 발생하면 더 정확하게 업로드하는것으로..
Submodule 'security' (https://github.com/{orgran}/security.git) registered for path 'security'
Cloning into 'C:/{...}/security'...
remote: Repository not found.
클론 받는 과정에서 해당 submodule을 찾지 못하는 오류가 발생했다.
인증 과정에서의 문제라는 것을 알 수 있었고, SSH를 이용하여 해결하였다.
ssh -T git@github.com
# 예상 결과 : Hi {USER}! You've successfully authenticated, but GitHub does not provide shell access.
# 1-2. 해당 서브 모듈을 clone
git clone git@github.com:{organization}/security.git
# 서브모듈 업데이트
git submodule sync
git submodule update --init --recursive