회사에서 코드 리뷰를 진행하며, 동료의 커밋 크기가 상당히 큰 것을 확인했다.
커밋 크기란,
추가된 라인 수와 삭제된 라인 수의 합계를 의미한다.
커밋이 크면, 변화가 크다는 내용이고, 즉 리뷰할 때 많은 내용을 봐야한다는 것을 의미한다.
동료는 이런 상황이 오기전에 커밋 사이즈를 미리 알 수 있다면, 작업 분량을 적절히 분리하는데 도움이 될 것 같다고 했다.
커밋 크기, 즉 코드 변경 크기는 주로 원격 저장소에 Merge를 시도할 때 확인되지만,
이는 사후적인 행동에 불과하다. 이보다는 사전에 이를 확인하고 조치하는 것이 효율적이다.
그 이유는 다음과 같다.
- 코드 리뷰의 부담 감소
- 하나의 커밋에서 많은 변경이 발생할 경우, 리뷰어에게 큰 부담이 되며, 리뷰시 버그나 오류를 발견하기 어렵게 한다.
- 작은 변경의 이점
- 작은 변경 크기는 컨텍스트를 간결하게 유지해, 릴리즈의 부담을 줄이고, 코드 리뷰 시에도 리뷰어의 부담을 감소시킨다.
- 또한 버그나 오류를 상대적으로 더 쉽게 찾을 수 있다.
- 작업 분량의 적절한 분배
- 커밋 전에 변경 크기를 알 수 있다면, 작업량을 적절히 분배해 효율적으로 작업할 수 있다.
동료가 제시한 문제를 해결하기 위해, Git의 로컬 변경 사항을 분석하는 쉘 스크립트를 만들었다.
간단한 시간을 투자하여 큰 사용성을 얻어 매우 효과적이었다.
- 쉘 스크립트를 만들어서
git stat
라는 alias를 추가하고,- git stage에 있는 변경의 크기를 미리 알 수 있도록 작업한다.
이 스크립트는 https://github.com/baekdev/git-stat 를 통해 전체 코드 확인이 가능하다.
1. 스크립트 만들기
Step 1. 변경사항 준비
먼저, Git의 변경 사항을 분석하고 그 크기를 알려주는 쉘 스크립트를 작성한다.
아래는 그러한 기능을 수행하는 쉘 스크립트의 코드이다.
git add -A && git diff --cached --numstat | awk '{
# ...
} END {
# ...
}'
위 스크립트는 아래와 같은 순서로 실행된다.
- git add -A를 실행하여 모든 변경 사항을 stage 상태로 만든다.
- git add -A를 사용하는 이유는 unstaged 상태의 파일들까지 포함하기 위함이다.
- git diff —cached —numstat를 실행하여 stage 상태의 파일들 간의 차이점을 계산하고, 추가 및 삭제된 라인 수를 출력한다.
- —cached 옵션은 staged 상태의 변경 사항들에 대해 작동하며, —numstat 옵션은 추가/삭제된 라인 수를 숫자로 출력한다.
- awk 명령어를 사용하여 각 파일에 대한 추가 및 삭제된 라인 수를 합산한다.
Step2. 변수 초기화
count+=1;
plus+=$1;
minus+=$2;
count는 변경된 파일 수를 저장, plus와 minus는 각각 추가된 라인 수와 삭제된 라인 수를 저장하는 변수이다.
Step3. 컬러 변수 설정
BLACKC="\033[30m";
REDC="\033[31m";
REDB="\033[41m";
GREENB="\033[42m";
YELLOWB="\033[43m";
BLUEC="\033[34m";
BLUEB="\033[44m";
MAGENTB="\033[45m";
NORMALB="\033[49m";
NORMALC="\033[0m";
쉘 스크립트의 출력을 보기 좋게 하기 위해, 다양한 색상을 변수로 저장하여 사용한다.
컬러는 터미널의 테마 등에 다르게 보일 수 있으니 각자의 상황에 맞게 변경해도 무방하다.
Step4. 커밋 사이즈 크기 범위 설정
rangeTo["XS"] = 10;
rangeTo["S"] = 50;
rangeTo["M"] = 100;
rangeTo["L"] = 250;
변경 사항의 크기를 XS, S, M, L, XL로 나누어 분류한다.
각 분류는 변경된 라인 수에 기반하여 결정된다. 250라인 이상은 XL이다.
Step5. 결과 출력
printf ">>> Git Local Changes Stat\n";
여기서 스크립트는 git local change 결과를 출력하기 시작한다.
if (plus <= 0 && minus <= 0) {
printf "›>> Any no changes \n";
exit 0;
}
추가나 삭제된 라인이 없는 경우, 변경 사항이 없음을 출력하고 스크립트를 종료한다.
sum = plus + minus;
size = "XS";
color = GREENB;
if ( sum < rangeTo["XS"] ) {
size = "XS"
color = GREENB;
} else if ( sum < rangeTo["S"] ) {
size = "S";
color = BLUEB;
} else if( sum < rangeTo["M"] ) {
size = "M";
color = YELLOWB;
} else if( sum < rangeTo["L"] ) {
size = "L";
color = MAGENTB;
} else {
size = "XL";
color = REDB;
}
printf ">>> " count " files," REDC plus " insertions(+), " BLUEC minus " deletions(-)" NORMALB NORMALC "\n";
printf ">>> " color BLACKC " Your commit size is " size ". " NORMALB NORMALC "\n";
추가 및 삭제된 라인 수의 합계를 계산하고, 이를 기반으로 변경 사항의 크기를 분류한다.
그리고 그에 맞는 색상을 설정한다. 이 부분에서는 두 가지 정보를 출력한다.
- 변경된 파일의 수, 추가된 라인 수, 삭제된 라인 수
- 계산된 커밋 사이즈와 그에 따른 색상
따라서 이 스크립트를 실행하면, 이 스크립트가 변경된 파일의 수와 추가/삭제된 라인의 수를 계산하여 이를 기반으로 커밋 사이즈를 판단하고, 그 결과를 색상화된 문자열로 출력하게 된다. 이렇게 하면 커밋 사이즈를 한눈에 알아볼 수 있어 효율적이다.
허나 스크립트를 매번 수동으로 특정 프로젝트마다 실행할 수는 없으니 git alias로 스크립트 실행을 단축키처럼 등록하여 사용성을 높히자.
그럼 이제 이 스크립트를 git_local_changes_stat.sh
라는 이름의 파일로 저장한다.
Git Alias 추가
Step1. 파일 권한 설정
앞서 저장한 git_local_change_stat.sh 파일에 권한을 부여하자.
파일이 위치한 경로를 맞게 작성해준뒤 권한 부여 명령어를 실행한다.
$> chmod 755 ~/Downloads/git_local_changes_stat.sh
Step2. Git Alias 추가
역시나 쉘 스크립트 파일이 위치한 경로에 맞게 작성해준뒤 git config에 alias를 추가한다.
$> git config --global alias.stat '!sh ~/Downloads/git_local_changes_stat.sh'
테스트
마지막으로, 작성한 스크립트가 잘 동작하는지 테스트한다.
git이 설정된 프로젝트 폴더로 이동한뒤 git stat
별칭을 입력한다.
그러면 커밋 사이즈에 따라 서로 다른 색상의 메시지가 출력된다.
$> cd ~/projects/sample
$ ~/projects/sample> git stat
결과
마무리
이렇게 우리는 쉘 스크립트를 통해 Git commit 사이즈를 미리 알아볼 수 있게 되었다. 이제 커밋 사이즈에 따른 분석이 필요할 때마다 git stat 명령어를 통해 쉽게 확인할 수 있다.
개인 개발자 혹은 팀 차원에서도 커밋 사이즈에 대한 구간별 협의를 맞춘다면,
이 스크립트의 활용하여 Ground Rule을 만들어 볼 수 있다.
이를 통해 효과적이고 빠른 리뷰를 통해 더 발전적인 문화를 만들 수 있을 것 이다.
이제 이 스크립트는 자신의 워크플로우에 맞게 쉽게 커스텀할 수 있으므로,
여러분만의 버전을 만들어 보시기 바란다.
References