git에 특정 조건을 걸어서 메시지등을 출력하는 hook이라는 기능이 있다.

(더 상세한 내용은 이 블로그 말고 다른곳을 검색해보기 바란다)

 

훅을 처음 써보면서, shell script도 제대로 쓸줄몰라 엄청 해멨으나 일단 원하는걸 하나 구현해놨기에 기록해둔다.

 

원하는건 코드 컨벤션을 맞추기 위해 설정한 문구 중

모든 코드 스타일을

void foo()
{
codes;
}

  방식으로 픽스하기 위한 조건이었다.

 

그걸 위해, 검색해서 pre-commit 을 수정해보려고 하니... 에러가 뜬다.

 

error: cannot spawn .git/hooks/pre-commit: No such file or directory

 

대충 이런 문구다.

 

요약하면 pre-commit이라는 hook이 없다는 얘긴데...

 

정확한 이유는 파악하지 못했으나, git 용 hook에 필수적으로 포함되어야 하는 문구들이 있는 모양이었다.

 

해서, 검색을 통해 어떤 문구가 있어야하는지 파악을 해두고, 문구 적용을 시켜보도록 했다.

 

 

 

#단순히 ") {" 스타일이 들어오면 밴 먹임

disallowed="){"


git diff --cached --name-status | while read x file; do
	if ["$x" == 'D']; then continue; fi #뭔 의미지? 'D'가 뭐지?
	
	if grep ')\s{' $file ; then
    echo "ERROR: 코드 스타일 에러입니다."
    exit 1
	fi	
	
	for word in "$disallowed"
	do
	    if egrep $word $file ; then
        echo "ERROR: Disallowed expression \"${word}\" in file: ${file}"
        exit 1
    fi
    done
		
done || exit $?

 

완성된건 이런 스타일인데, 정리하면 다음과 같다.

 

1. disalowed에 "없어야 될 문자열"을 기록한다.

2. git에서 수정된 사항을 읽는다.

3 (은 이해를 못했습니다...)

4. 파일을 전체 검색하며, 조건에 맞는 문자열이 있는지 검사후, 조건에 만족하면 echo  메시지를 띄운 후 에러를 리턴한다.

5. 정상 통과 하면 while문을 종료시키고 끝낸다.

 

의 구조이다.

 

웃긴점은, 이를 좀 "있어보이게" / "다른 사용자들이 큰 수정할 필요없이" 적용을 시키기 위해 core.hooksPath를 수정해줬더니 저 hook 조차 에러를 검사하여 리턴해버리는게 아닌가...

이거 뭔... 제 발등 찍기도 아니고

해서, 이런 경우에는 hookspath를 임의로 수정해준 뒤, 커밋 갱신을 해줘야 하는 소소한 불편함(?)이 발생하고 있다.

 


 

해당 문서를 위해

woowabros.github.io/tools/2017/07/12/git_hook.html

 

훅으로 Git에 훅 들어가기 - 우아한형제들 기술 블로그

들어가며…

woowabros.github.io

singun.github.io/2019/03/16/git-hook-pre-commit/

 

특정 문자열이 커밋되는 것을 막아보자 - Programming Singun

페이스북이나 인스타그림 등의 open api를 사용하기 위해서는 인증을 위한 토큰 값이나 키 값을 사용해야 할 때가 있습니다. 민감할 수 있는 정보라 git 에 커밋하는게 그리 달갑지 않아, 이런 경우

singun.github.io

두 문서를 참고하였습니다. 감사합니다.

+ Recent posts