페어 코딩을 할 기회가 종종 있습니다. 페어 코딩을 하게 되면 좋은 점이 있는데요. 물론 나쁜 점도 있어요. 이 얘기는 나중 더 자세히 적을 기회가 있을 것 같습니다. 아무튼 페어 코딩을 종종 하는데, 이때 공동 작업자를 기록하기가 애매합니다. 기본 적으로 Git에는 저자를 한 명 기록하게 돼있으니까요, 하루는 이 사람, 하루는 저 사람으로 기록하는 규칙을 정하자니 뭔가 불편합니다. ( 사실 이렇게도 해봤는데, 서로 자기 이름을 기록하지 않으려 하더라고요. )
그래서 공동작업을 기록하는 방법을 찾아보기로 했습니다. 우선 저는 GitHub을 사용하고, 리눅스, 혹은 Mac에서 주로 개발합니다. 지금 설명하는 방법은 윈도우에서는 해보지 않았습니다. ( 되겠죠? 뭐 ) 그럼 공동 작업을 기록하는 방법을 찾아서 적용한 것을 설명하겠습니다.
1. Git Local 에서 공동작업자 기록하기 - git pair
먼저 로컬에서 공동작업자 기록하기, 찾아보면 여러 개가 있는 걸 볼 수 있는데, https://github.com/pivotal-legacy/git_scripts 이걸 썼습니다. 설치는 명령어 한 줄로 끝날 만큼 간단합니다. ubuntu와 MacOS에서 모두 쉽게 설치됩니다.
$ sudo gem install pivotal_git_scripts
Fetching: pivotal_git_scripts-1.4.0.gem (100%)
Successfully installed pivotal_git_scripts-1.4.0
Parsing documentation for pivotal_git_scripts-1.4.0
Installing ri documentation for pivotal_git_scripts-1.4.0
Done installing documentation for pivotal_git_scripts after 1 seconds
1 gem installed
설치하고 나면 git 에 두 가지 명령이 추가되는데 하나는 git pair 다른 하나는 git about입니다.
> git about 은 현재 리파지토리의 저자 정보를 보여줍니다.
$ git about
git user: bitlog
git email: bitlog@tistory.com
GitHub project: NONE
> git pair는 공동 저자를 설정하거나, 해제 하는 기능을 합니다. git pair를 사용하려면 먼저 ". pairs" 파일을 먼저 작성해야 합니다. pairs 의 내용에는 공동 작업을 할 모두를 적습니다.
pairs:
gd: gildong
aj: airjordan
jb: jackbower
email:
prefix: pair
domain: tistory.com
* 작성 하실 때, 이름은 이메일과 동일하게 적어주시고, prefix로 pair로 해주세요. *
그러면 이제 다음과 같이 공동 저자를 설정하거나 해제할 수 있습니다. git pair 다음에 약자를 적어주면 공동 저자 설정이 되고, 아무 옵션을 주지 않으면 공동 저자가 해제되고 원래 대로 돌아갑니다.
# jackbower와 airjordan을 공동 작업자로 설정
$ git pair jb aj
NOTE: Overriding global user.name setting with local.
global: user.name bitlog
local: user.name airjordan and jackbower
NOTE: Overriding global user.email setting with local.
global: user.email bitlog@tistory.com
local: user.email pair+airjordan+jackbower@tistory.com
local: user.initials aj jb
# 공동 작업자 해제
$ git pair
Unset user.name, user.email, user.initials
global: user.name bitlog
global: user.email bitlog@tistory.com
공동 저자를 설정하고 나서 커밋한 로그는 다음과 같이 나옵니다.
commit 68be6ee9188e0e91a6bd85481d232fd65faa405c (HEAD -> master)
Author: airjordan and jackbower <pair+airjordan+jackbower@tistory.com>
Date: Wed May 13 21:21:11 2020 +0900
이제 이 커밋은 누가 작업 했는지 정확하게 기록할 수 있게 되었습니다.
2. GitHub에서 공동작업자 기록하기 - git hook
그러면 공동 작업자가 GitHub에서는 어떻게 보일까요? ( GitHub을 사용하지 않는다면 여기는 하지 않으셔도 됩니다. )
공동 저자가 모두 잘 보여서 누가 작업한지는 알겠는데, 실제 GitHub 계정으로 표시되지는 않습니다. GitHub에서는 공동 저자를 표시하려면 커밋 메시지를 작성할 때 맨 아래 "Co-authored-by: name <name@example.com>"의 형식으로 공동 저자를 적어 주면 됩니다.
( https://help.github.com/en/github/committing-changes-to-your-project/creating-a-commit-with-multiple-authors ) 이제 커밋 할 때마다 마지막에 메시지를 추가해 주면 됩니다. 간단하죠?
매번 저걸 기록 하면... 커밋할 때마다 저 걸 기록하면....
엄청 귀찮을거 같아서 조금 더 고쳤습니다.
prepare-commit-msg를 이용해서 커밋 메시지를 작성할 때 자동으로 공동 저자 정보를 남길 겁니다. 그보다 먼저 hook을 공유하기 위해서 한 가지 설정을 변경하고 prepare-commit-msg 훅을 복사해 줍니다.
$ git config core.hookspath hook
$ mkdir hook
$ cp .git/hooks/prepair-commit-msg.sample ./hook/prepair-commit-msg
이 설정은 hook 파일의 위치를 변경하는 것인데, .git 안에 있는 파일은 트래킹 되지 않기에 위치를 변경해서 형상관리에 추가하기 위해서 변경했습니다. 그리고 .sample 확장자를 삭제해서 prepair-commit-msg hook을 사용하도록 설정했습니다.
이제 prepair-commit-msg 파일에 다음 내용을 추가합니다.
PAIR=$(git config user.email)
if [[ ${PAIR:0:4} = "pair" ]]
then
IFS='@' read -r -a array <<< "$PAIR"
DOMAIN="${array[1]}"
echo ""
IFS='+' read -r -a array <<< "${array[0]}"
unset "array[0]"
for index in "${!array[@]}"
do
echo "Co-authored-by: ${array[index]} <${array[index]}@$DOMAIN>" >> $COMMIT_MSG_FILE
done
fi
공동 저자가 설정되어 있는 경우, GitHub에서 표시되도록 커밋 메시지를 추가해 주는 겁니다. 이제 커밋을 하면 다음과 같이 이력이 남게 되구요.
commit f216ac50f1656260097e6cdff2d4fc736433d781 (HEAD -> master)
Author: airjordan and jackbower <pair+airjordan+jackbower@tistory.com>
Date: Wed May 13 21:46:49 2020 +0900
공동 저자 커밋
Co-authored-by: airjordan <airjordan@tistory.com>
Co-authored-by: jackbower <jackbower@tistory.com>
GitHub에서는 바라던 대로 공동 저자가 보이게 됩니다.
3명으로 보이는 이유는 "airjordan and jackbower"도 저자로 인식해서 그런 거니 무시해 줍니다. GitHub에 내 계정이 보이는 것만 해도 큰 발전이니까요. 아. 그런데 이렇게 해도 intellj에서는 공동 저자 표시는 안됩니다. "airjordan and jackbower"가 저자로 보입니다.
손이 한번 더 가긴 하지만, Pair코딩을 할 기회가 있으시다면, 설정해서 이력을 좀 더 정확히 기록해보시면 좋을 것 같습니다. 지금까지 사용한 코드는 https://github.com/ikaruce/gitpair에 올려 뒀습니다.