Git submodule commit + push 자동화 적용 이슈

yeahdy_:)·2024년 7월 23일

error

목록 보기
5/5
post-thumbnail

디렉토리 구조

main project/
│...
├── src/
│   └── main/
│       └── resource/
│           └── application.yaml
└── submodule/

submodule패키지는 submodule 레포지토리(private 설정)와 연결되어 있는데, application.yaml 파일과 같은 예민한 정보를 팀원과 공유하고 관리를 하기 위해 적용했다.

목적

AS-IS

  1. submodule 패키지에 application.yaml 설정을 작성 또는 수정
  2. submodule 레포지토리에 수동으로 commit + push
  3. main project에서 서브모듈 변경사항 적용

TO-BE

git hook을 사용 해 pre-commit 시 스크립트로 서브모듈에 변경사항 적용
main projectsubmodule 을 동시에 동기화 하는 것이 목적

  1. main project에서 application.yaml파일을 수정
  2. main project에서 commit 할 경우 pre-commit 훅을 통해 submodule프로젝트에 먼저 commit 적용
  3. 이후에 main project에서 commit 적용을 한번에 자동화


이슈

  1. main project에서 application.yaml 파일을 수정하고, commit 할 경우 pre-commit 실행

  2. pre-commit 스크립트에서 submodule레포지토리에 접근 해 main project에서 변경한 application.yaml파일을 복붙해서 commit

  3. 2번 과정에서 이슈 발생! git 의 2가지 활동이 동시에 일어나기 때문에 불가능
    main project의 commit + submodule의 commit

   fatal: Unable to create '***/.git/index.lock': No such file or directory
  1. 위 에러에서 말하는 ‘***/.git/index.lock’ 의 경우 submodule레포지토리는 .git 폴더가 아닌 파일 형태로 되어 있기 때문에 index.lock 파일을 찾을 수 없었다.


⭐생각의 전환!

main project에서 application.yaml 파일을 수정(또는 추가)했을 때 commit 전에 먼저 submodule에 commit이 되어야 한다.
따라서 submodule에 application.yaml 파일 작성 후 commit + push 하는 수동 작업이 필요한데, 이부분을 스크립트를 사용 해 자동화하고 스크립트는 gradle task를 통해 실행 하도록 변경했다.

해결

submodule레포지토리에 commit + push 수동 작업을 스크립트를 통해 자동화하기!

  1. submodule commit + push 자동화 스크립트 작성
    #!/bin/bash
    
    # root directory
    MAIN_REPO_PATH=$(git rev-parse --show-toplevel)
    # submodule directory
    SUBMODULE_PATH="$MAIN_REPO_PATH/board-submodule"
    # 파일명이 application 인 파일 불러오기
    TARGET_FILES=$(find "$MAIN_REPO_PATH/src/main/resources" -type f -name 'application*')
    
    cd "$MAIN_REPO_PATH"
    echo "-----------SUBMODULE COMMIT START-----------"
    for file in $TARGET_FILES; do
      if [[ "$file" == *application* ]]; then
        echo "READ $file"
        cp "$file" "$SUBMODULE_PATH/backend"
    
        cd "$SUBMODULE_PATH"
        git add "backend"
      fi
    done
    
    # commit & push in submodule repository
    git commit -m "Feat: update application files"
    git push origin main
    echo "-----------SUBMODULE COMMIT END-----------"
    
  1. main project에서 application.yaml 파일 추가 또는 수정 후 gradle task 로 위 스크립트 실행
    (다만 스크립트는 수동으로 실행해야 한다..)

  2. 스크립트 실행 과정
    a. main project에서 수정한 application.yaml 파일 submodule/backend 폴더로 복사
    b. submodule레포지토리 경로에서 commit + push

  3. submodule레포지토리에 변경사항 자동으로 반영!

이렇게 하면 main project에서 변경한 설정 파일을 서브모듈과 동기화 할 수 있고, 로컬환경에서 main project를 커밋할 때 서브모듈의 변경된 커밋사항도 함께 원격저장소로 반영하면 된다.

아쉬운 점은 서브모듈 원격저장소로 commit+push를 함께 적용하기 때문에 커밋메세지가 고정된다는 점이 있다

profile
기억하기 위해 기록하고 있습니다. 포스트 중 잘못된 정보가 있다면 코멘트 남겨주세요🐰

0개의 댓글