git stat를 이용하여 코드 리뷰 요청 전 커밋 사이즈 관리하기

회사에서 코드 리뷰를 진행하며, 동료의 커밋 크기가 상당히 큰 것을 확인했다.

커밋 크기란,
추가된 라인 수와 삭제된 라인 수의 합계를 의미한다.

커밋이 크면, 변화가 크다는 내용이고, 즉 리뷰할 때 많은 내용을 봐야한다는 것을 의미한다.
동료는 이런 상황이 오기전에 커밋 사이즈를 미리 알 수 있다면, 작업 분량을 적절히 분리하는데 도움이 될 것 같다고 했다.

커밋 크기, 즉 코드 변경 크기는 주로 원격 저장소에 Merge를 시도할 때 확인되지만,
이는 사후적인 행동에 불과하다. 이보다는 사전에 이를 확인하고 조치하는 것이 효율적이다.

그 이유는 다음과 같다.

  1. 코드 리뷰의 부담 감소
    • 하나의 커밋에서 많은 변경이 발생할 경우, 리뷰어에게 큰 부담이 되며, 리뷰시 버그나 오류를 발견하기 어렵게 한다.
  2. 작은 변경의 이점
    • 작은 변경 크기는 컨텍스트를 간결하게 유지해, 릴리즈의 부담을 줄이고, 코드 리뷰 시에도 리뷰어의 부담을 감소시킨다.
    • 또한 버그나 오류를 상대적으로 더 쉽게 찾을 수 있다.
  3. 작업 분량의 적절한 분배
    • 커밋 전에 변경 크기를 알 수 있다면, 작업량을 적절히 분배해 효율적으로 작업할 수 있다.

동료가 제시한 문제를 해결하기 위해, Git의 로컬 변경 사항을 분석하는 쉘 스크립트를 만들었다.
간단한 시간을 투자하여 큰 사용성을 얻어 매우 효과적이었다.

  1. 쉘 스크립트를 만들어서
  2. git stat라는 alias를 추가하고,
  3. git stage에 있는 변경의 크기를 미리 알 수 있도록 작업한다.

이 스크립트는 https://github.com/baekdev/git-stat 를 통해 전체 코드 확인이 가능하다.

1. 스크립트 만들기

Step 1. 변경사항 준비

먼저, Git의 변경 사항을 분석하고 그 크기를 알려주는 쉘 스크립트를 작성한다.
아래는 그러한 기능을 수행하는 쉘 스크립트의 코드이다.

git add -A && git diff --cached --numstat | awk '{
  # ... 
} END {
  # ...
}' 

위 스크립트는 아래와 같은 순서로 실행된다.

  1. git add -A를 실행하여 모든 변경 사항을 stage 상태로 만든다.
    • git add -A를 사용하는 이유는 unstaged 상태의 파일들까지 포함하기 위함이다.
  2. git diff —cached —numstat를 실행하여 stage 상태의 파일들 간의 차이점을 계산하고, 추가 및 삭제된 라인 수를 출력한다.
    • —cached 옵션은 staged 상태의 변경 사항들에 대해 작동하며, —numstat 옵션은 추가/삭제된 라인 수를 숫자로 출력한다.
  3. 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 stat

마무리

이렇게 우리는 쉘 스크립트를 통해 Git commit 사이즈를 미리 알아볼 수 있게 되었다. 이제 커밋 사이즈에 따른 분석이 필요할 때마다 git stat 명령어를 통해 쉽게 확인할 수 있다.

개인 개발자 혹은 팀 차원에서도 커밋 사이즈에 대한 구간별 협의를 맞춘다면,
이 스크립트의 활용하여 Ground Rule을 만들어 볼 수 있다.
이를 통해 효과적이고 빠른 리뷰를 통해 더 발전적인 문화를 만들 수 있을 것 이다.

이제 이 스크립트는 자신의 워크플로우에 맞게 쉽게 커스텀할 수 있으므로,
여러분만의 버전을 만들어 보시기 바란다.


References



쿠팡 파트너스 활동을 통해 일정액의 커미션을 제공받을 수 있습니다.