[번역] Git으로 여러 작성자 사용하기

[번역] Git으로 여러 작성자 사용하기

얼마 전 실수로 회사 gitlab에 제 github 계정으로 커밋을 해버리는 실수를 했습니다. 구글링으로 찾아본 해결방법 중 가장 큰 도움이 되었던 폴란드 개발자 Keegan Rush의 「Using Multiple Author Identities With Git」을 한국어로 번역했습니다. 도움이 되었으면 좋겠습니다. 제 첫 영어번역 글이기도 합니다. 잘못된 부분이 있다면 댓글로 말씀주시면 감사하겠습니다.

얼마나 많은 Git 계정을 서로 다른 조직에서 관리하고 있나요? 여러분이 현장에서 개발 중인 프로젝트는 email이 올바른 도메인에 속하는지 확실히 하기 위한 pre-push hook을 갖고 있을 수도 있습니다. 아마도 서로 다른 email 주소를 사용하는 몇개의 개인 프로젝트를 가지고 있을 수도 있고요. 또는 단순히, 당신의 repository에게 알리기 싫은 비밀스러운 계정을 가지고 있을 수도요.

버전컨트롤이라고 부르는 이 정신분열적인 다중인격을 어떻게 하면 관리할 수 있을까요?

만약 제가 잘못된 email로 작업 중에 커밋해버린다면, 내부 Bitbucket서버에 push되는걸 허락치 않을 겁니다. 만약 잘못된 email로 제 개인 Github 레포지토리 중 하나에 커밋했다면, 전 이런 추악한 상황으로 끝나버릴 겁니다.

커밋 히스토리

저 커밋은 제 이름이 포함된 이미지를 가지고 있지 않은 반면 식별되지 않은 email을 가지고 있습니다. 그러므로 Github은 저게 진짜 저라는 걸 알지 못하고 제 Github 계정으로도 연결해주지 못합니다.

여러 정체성 추정하기

git 커밋은 작성자 이름과 email을 가지고 있습니다. git log 를 레포지토리에서 실행시키면 여러분이 최근에 했던 커밋의 몇 개의 메타데이터를 볼 수 있습니다.

commit bd294498cbd5c67b51096518ce62c9204068be2c
Author: Bruce Wayne <bruce.wayne@wayneenterprises.com>
Date:   Tue Feb 14 19:58:34 2017 +0200

  Plan attendance to charity events

git은 ~/.gitconfigC:\Users\MyUser\.gitconfig에 위치한 전역 .gitconfig 안에 존재하는 유저 이름과 email 세트를 사용합니다. [user] 블럭은 모든 커밋에 작성자 이름과 이메일 주소를 설정합니다. 여러분은 수동으로 이 파일을 수정함으로서 설정이 할 수 있습니다.

$ vim ~/.gitconfig
[user]
        name = "Bruce Wayne"
        email = "bruce.wayne@wayneenterprises.com"

깃은 또한 전역설정을 업데이트하는 커맨드를 제공합니다.

$ git config --global user.name "Bruce Wayne"
$ git config --global user.email bruce.wayne@wayneenterprises.com

위 커맨드는 여러분을 위한 전역 .gitconfig를 수정합니다.

레포지토리 레벨에 맞는 정체성 명시하기

이제 여러분은 여러분의 전역 정체성을 만들어보았으므로 또 다른 하나를 특정 레포지토리에 추가해보는 건 어떨까요? 각 레포지토리에는 언제든 전역 설정을 재지정할 수 있는 레포지토리만의 고유한 설정 파일이 있습니다. - 그건 비밀경로에 위치합니다. 여러분의 레포지토리 안에 있는 .git/config를 보죠.

레포지토리 고유의 비밀 정체성을 만들기 위해, 파일을 수정하고 유저 설정파일을 생성하여 전역 설정을 재지정하세요.

$ vim ~/.gitconfig

또는, git config 커맨드를 실행하고 바뀐 부분을 레포지토리의 로컬로 명시할 수 있습니다.

$ git config --local user.name "Batman"
$ git config --local user.email "batman@justiceleague.com"

아래는 여러분이 하게 되는 .git/config 설정입니다.

[user]
        name = "Bruce Wayne"
        email = "bruce.wayne@wayneenterprises.com"

이제 여러분은 당신의 비밀 정체성 아래에 있는 Git을 이용할 수 있습니다!

Author: Batman <batman@justiceleague.com>
Date:   Wed Feb 15 04:53:57 2017 +0200

    Create initial blueprints for Batcave

이건 좀 늦었는데요, 전 이미 잘못된 이메일로 커밋해 버렸어요!

가끔 여러분은 실수를 합니다, 마치 이것처럼요:

Author: Bruce Wayne <bruce.wayne@wayneenterprises.com>
Date:   Thurs Feb 16 19:21:35 2017 +0200

    Fight crime in downtown Gotham

이런 커밋 작성자로, 배트맨의 비밀 정체성은 분명 위태로운 위험에 처합니다. 운좋게, 여러분은 아직 push하기 전 이 커밋을 수정할 기회를 가지고 있습니다.

경고

이 밑에 나열될 제안은 여러분의 깃 히스토리를 수정합니다. 여러분이 이미 변경사항을 push했다면, 변경사항을 force push해야한다는 걸 의미합니다. 심지어 더 나쁜 것은, 변경사항이 업스트림이고 다른 개발자들이 당신이 바꾸려고 하는 커밋을 가진 브랜치 위에서 작업중이라면, 일은 정말 까다로워집니다. 가장 안전한 결정은 이미 공개적으로 다른 개발자들에게 보이는 커밋을 수정하는 것을 삼가는 것입니다.

##가장 최근 커밋을 수정하자

여러분이 바꿀 커밋이 가장 최근 커밋이라면 여러분은 이 것처럼 쉽게 바꿀 수 있습니다:

$ git commit --amend --author="Author Name <authoremail@example.com>"

git commit --amend를 사용하면 커밋 메세지를 변경할 수 있습니다. 그리고 그 --author="Author Name <authoremail@example.com>"파트는 여러분이 지정한 작성자 이름과 이메일을 설정합니다.

여러분은 다음과 같이 이전 커밋을 수정 하는 데에 사용할 수 있습니다.

Author: The Dark Knight <batman@justiceleague.com>
Date:   Thurs Feb 16 19:21:35 2017 +0200

    Fight crime in downtown Gotham

배트맨 조차 가끔은 도움을 구할 때가 있죠.

대화형 rebase

제가 좋아하는 트릭의 하나인 대화형 rebase는 가장 최근 커밋이 아닌 다른 커밋에도 사용됩니다. 이 튜토리얼이 rebase하는 것에 속도를 높여줄 것입니다. 커밋 작성자를 수정하기 위해, 우리는 대화형 rebase를 실행, 바꾸고자 하는 커밋을 고치도록 지정하고 나서 전에 커밋 작성자를 수정하는데에 사용한 git commit --amend --author 커맨드를 실행합니다.

$ git rebase -i head~4

우리는 막 대화형 rebase를 시작했습니다. 다음을 포함한 텍스트 에디터가 나타날 것입니다:

pick fe79802 Buy new batmobile
pick 04a7c9c Dent new batmobile
pick 2a826b2 Attend Policeman's Ball
pick 1d12e8c Defuse bomb before detonation

# Rebase 56d3e50..1d12e8c onto 56d3e50 (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

우리는 배트맨의 정체성에 따라 Policeman’s Ball에 attend했지만(역주: 이 부분은 해석이 힘드네요), 실제로는 브루스 웨인이어야 합니다. 세번째 줄의 pickedit로 바꾸세요.

edit 2a826b2 Attend Policeman's Ball

이제 우리는 올바른 작성자를 설정하도록 수정할 수 있습니다.

$ git commit --amend --author="Bruce Wayne <bruce.wayne@wayneenterprises.com>"

끝나면, git remase --continue를 실행하여 수정을 명시할 다음 커밋으로 이동하거나 rebase 세션을 끝내도록 합니다.

바뀐 커밋을 묶자

이 블로그 포스트의 범위를 넘는 방법인 git filter-branch 커맨드를 사용하여, 여러분은 모든 종류의 미친 짓이 가능합니다. 납득되는 사용법 중에 한가지는 여러분의 레포지토리 안의 모든 커밋을 검사하여 특정 이메일 주소와 매치되는지 체크하여, 바꿀 수 있습니다.

제가 그걸 수행하는 Gist를 Github에 만들었습니다: author-amend

여러분의 레포지토리 루트에 저장하고 실행하거나, 터미널에 복사+붙여넣기 하세요.

OLD_EMAIL CORRECT_NAME그리고 CORRECT_EMAIL을 여러분의 필요에 맞게 바꾸세요.

작성자 정체성을 바꾸는 건 그렇게 어렵지 않다.

한번 올바른 커맨드를 알게 되면, 언제나 여러분의 필요에 맞게 git을 다룰 수 있는 방법이 있습니다. 잘못된 이름으로 참을 필요가 없고, 커밋을 모아 재시작할 필요도 절대 없습니다.

그러므로 뭔가 잘못 되면, bear

기억하세요, git commit --amend는 여러분의 친구입니다.

이 기사를 읽는데에 시간을 들여주셔서 감사합니다. 전 여러분들이 앞으로도 도움 될 만한 무언가를 배우기를 바랍니다. 만약 그랬다면 페이스북, 트위터, 레딧 또는 무엇이든 사람들이 최근 이용하는 서비스에 이 포스트를 공유해주세요.