dinist

git pull 이후 hook으로 소유자 변경하기 본문

GIT

git pull 이후 hook으로 소유자 변경하기

dinist 2023. 6. 8. 15:46

git pull을 수행 이후 해당 파일들의 소유자가 현재 로그인한 사용자로 지정되는데요

 

만약 pull 하는 계정과 실제 이 파일을 사용하는 사용자가 다를경우 퍼미션 에러에 봉착할 수 있습니다.

 

저도 docker를 활용한 php 개발을 진행하던중 이러한 상황이 발생하여 해법을 생각하던 중 git의 hook을 이용한 방법으로 문제를 해결해보기로 했습니다.

 

git에서는 hook을 제공합니다.

git에서 어떠한 이벤트가 발생했을때 특정 스크립트를 실행하도록 할 수 있다는 의미입니다.

 

아래 참조 사이트를 통해 사용 가능한 hook을 확인할 수 있습니다.

https://git-scm.com/book/ko/v2/Git%EB%A7%9E%EC%B6%A4-Git-Hooks

 

Git - Git Hooks

여기서 한가지 알아둘 점은 저장소를 Clone 해도 클라이언트 훅은 복사되지 않는다는 점이다. 만든 정책이 반드시 적용되도록 하려면 서버 훅을 이용해야만 하며 작성은 정책 구현하기 부분을 참

git-scm.com

 

저는 pull이 완료된 후에 pull한 파일들의 소유자를 변경해야 하므로 post-merge hook을 이용하면 됩니다.

 

.git 디렉토리 내부에 hooks라는 폴더가 있습니다.

이 폴더 내부에 *.sample 파일의 예시 파일들이 있습니다. 이를 참조하여 hook을 만들어도 되겠네요

 

post-merge 파일을 만들고 아래와같이 작성합니다.

git Repository/.git/hooks 폴더 내에 위치시킵니다.

#!/bin/bash
MOD_FILES=`git log -n 1 --name-only --format=""`

OWN_USER="root"
OWN_GROUP="www-data"

PRE_IFS="$IFS"
IFS=$'\n'
STR_ARR=($MOD_FILES)
IFS="$PRE_IFS"

for x in "${STR_ARR[@]}"
do
        `chown ${OWN_USER}:${OWN_GROUP} $x`
done

 

MOD_FILES 변수는 git log 명령어를 활용합니다. git pull을 완료하자마자 실행할 것이므로 가장 최근 로그를 확인하기 위해 -n 1 옵션을 줍니다. 그리고 파일명만 확인하기 위해 --name-only 옵션을 사용하고, 다른 정보는 필요가 없으므로 format은 정하지 않습니다.

 

OWN_USER와 OWN_GROUP은 chown 명령을 실행할때  각각 소유자와 그룹을 지정합니다.

 

PRE_IFS, IFS가 있는데

IFS는 IFS(Internal Field Separator) 라고 해서 쉘에서 문자열을 나눌때의 기준이 되는 문자가 정의된 환경변수입니다.

 

주의할 것은 환경변수이므로 IFS를 변경해서 사용했을경우 반드시 이전 상태로 되돌려야합니다.

그렇지 않으면 다른 쉘에서 오류가 발생할 수 있습니다.

 

PRE_IFS는 기존의 IFS 환경변수 값을 담아놓습니다.

IFS는 임시로 지정할 문자열 구분자입니다. 여기서는 개행문자(\n)를 지정했습니다.

STR_ARR는 git log 명령을 실행한 결과를 배열에 담습니다.

이후 다시 IFS를 PRE_IFS 값으로 되돌려 놓습니다.

 

이후 반복문을 통해 split된 각 파일들을 chown 처리합니다.

 

이제 테스트를 해봅시다.

예시를 위해 모든 파일의 소유자 및 소유그룹을 root로 변경했습니다.

 

RunController.php와 ConfigController.php 파일의 수정 커밋을 만들어 push 후 pull을 해보겠습니다.

post-merge 파일에 실행권한을 주지 않으면 위와 같이 실행 권한이 없어 hook이 무시되었다는

노란색 안내문구가 나옵니다. 반드시 +x 권한을 주셔야합니다.

 

권한이 644였는데 755로 변경하겠습니다..

방금 pull 했던 것은  reset --hard로 되돌린 후 다시 pull 해보겠습니다.

 

이제 아까 보였던 안내문구가 사라졌습니다. 이제 소유자가 제대로 변경되었는지 볼까요?

아주 좋습니다. 변경이 잘 되었군요!

 

이 글이 누군가에게 도움이 되었으면 좋겠습니다.

 

 

 

이 과정을 진행하며 참조한 사이트들

 

https://webterror.net/2017/03/17/1716/

https://delightlylinux.wordpress.com/2020/02/16/bash-ifs-what-is-the-internal-field-separator/

https://git-scm.com/docs/pretty-formats