git config
git을 사용할 때, user name과 email 정보가 필요하다. 이 외에도 각종 설정들을 할 수 있는데, 이 때 사용하는 것이 git config이다. 이 설정들은 repository별로 설정도 가능하고, 글로벌하게 모든 프로젝트에 설정하는 것도 가능하다.
보통 가장먼저 해야할건, 글로벌하게 사용할 username과 email주소의 설정이다.
git config --global user.name "David"
git config --global user.email "david@example.com"사용하는 모든 git repository에 적용할 설정은 위와같이 “–global” 옵션을 붙여준다. 이 설정은 어디에 저장이 될까? 리눅스 기반으로만 얘기하자면, 총 3가지 경로가 있다고 한다. 일단, 리눅스가 여러 유저가 함께 사용이 가능하기 때문에 시스템 관리자가 모든 유저에게 적용할 내용을 설정하면 /etc/gitconfig 파일에 저장된다. 시스템 전체에 적용할 설정은 “–system” 옵션을 사용한다. 다음, 유저 본인이 사용하는 모든 git에 적용하는 설정은 “~/.gitconfig” 또는 “~/.config/git/config” 파일에 저장된다. 옵션은 앞에서 사용했듯, “–global”을 사용한다. 마지막으로 하나의 git에만 적용되는 설정은 해당 git 디렉토리인 “.git/config” 파일에 저장된다. “–local” 옵션을 사용하면 여기에 저장된다.
| git config –system … | /etc/gitconfig |
| git config –global … | ~/.gitconfig or ~/.config/git/config |
| git config –local … | .git/config |
만약 동일한 설정이 겹친다면, local > global > system 순서로 우선순위를 갖는다.
자주쓰일만한 설정을 몇개 더 살펴보자.
첫번째, github을 사용한다면 기본 브랜치 이름을 main으로 해야한다. github이 main을 쓰고 있기 때문에, master와 같은 이름을 사용하면 충돌이 생길 수 있다. 다음 명령어를 사용하면 된다.
git config --global init.defaultBranch main두번째, 라인 끝의 CRLF처리 문제다. 윈도우즈에서는 CRLF를 사용하고, 유닉스나 리눅스에서는 LF만 사용한다. 그러니까, 사용하는 OS가 윈도우즈라면 repository에서 가져올 때 LF -> CRLF로 변경하고, commit 할 때는 CRLF -> LF 로 변경하면 repository에서는 항상 LF로 되어있는 일관성이 생긴다. 리눅스에서는 가져올 때는 LF이므로 변환이 필요없고, commit하는 경우 혹시나 CRLF로 되어 있다면 CRLF -> LF로 변환해주면 된다. 이걸 git config에서 설정하면 자동으로 처리해주는데 사용방법은 다음과 같다.
# 윈도우즈의 경우
git config --global core.autocrlf true
# 리눅스의 경우
git config --global core.autocrlf input세번째로 git 을 사용하다보면 commit시 commit 메세지등 텍스트 에디터가 필요한 경우가 있다. 이 에디터를 사용자가 지정할 수 있다. vs code 나 sublime등을 사용하는 경우, “–wait” 옵션을 줘야한다고 한다. 그렇지 않으면 빈 화면이 뜰 수 있다고.
# vim
git config --global core.editor "vim"
# vscode
git config --global core.editor "code --wait"
# sublime
git config --global core.editor "subl -n -w"sublime의 경우 “-n -w” 옵션이 사용됐는데, new window, wait을 의미한다. 이 외에도 다른 에디터들에 대한 옵션이 progit ebook에 나와있다.
https://git-scm.com/book/en/v2/Appendix-C%3A-Git-Commands-Setup-and-Config
네번째로 git diff도 외부 툴 설정이 가능하다. meld에 대해서 diff 툴 설정을 알아보자.
git config --global diff.tool meld
git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'
git config --global difftool.prompt false첫번째 줄은 diff tool을 meld로 설정한다는 의미이다. 두번째 줄은 meld를 실행할 때, 어떻게 실행할지를 보여주는데, $LOCAL, $REMOTE 는 git 이 실행시, $LOCAL 에 현재파일, $REMOTE 는 비교할 파일을 의미한다. git이 meld를 실행하면서 알아서 인자를 넘겨주는 것. 매우 중요한게, 외따옴표로 묶여있고 안에 쌍따옴표로 묶여있는데, 만약 전체를 쌍따옴표로 묶으면 $LOCAL 과같이 $로 시작하는 값을 쉘이 해석해버려서 제대로 설정되지 않는다. 꼭, 외부를 외따옴표(‘)로 묶어서 쉘이 이 안에 있는 내용을 해석하지 않도록 하는것이 중요하다. 마지막 라인은 실행할 때마다 prompt로 물어보는걸 안나오도록 설정하는 의미이다. 다른 툴을 쓴다면, 이를 기반으로 찾아보시길.
다섯째로 merge 툴도 설정이 가능하며 meld로 설정하는 방법을 알아보자.
git config --global merge.tool meld
git config --global mergetool.meld.cmd 'meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"'이번엔 인자가 좀 많은데, 각각 의미는 다음과 같다.
| $LOCAL | 현재 브랜치 |
| $REMOTE | 상대 브랜치 |
| $BASE | 공통 조상 |
| $MERGED | merge된 결과파일 |
meld의 경우, 위와 같이 설정하면 3-way merge 를 지원하며, 왼쪽 패널에는 현재 브랜치인 $LOCAL, 오른쪽에는 병합할 상대 브랜치인 $REMOTE, 그리고 가운데에 공통조상인 $BASE가 보인다. 왼쪽과 오른쪽에서 base에 추가를 해서 저장을 하면 merge된 파일을 생성하게 된다. 원래 수동 병합의 경우, 현재 파일에
<<<<<<< HEAD
A
=======
test2 branch
>>>>>>> test2위와같이 표시하도록 되어 있지만, meld 툴에서는 이걸 표시하지 않고 공통 조상인 base에 추가함으로서 merged된 파일을 생성한다.
meld로 3-way merge시에 기본적으로 화살표를 이용해 replace가 이루어지는데, 양쪽 변경사항을 둘 다 적용하려면 Ctrl 키를 눌러 화살표를 ‘+’표시로 바꾼 후 눌러주면 insert모드가 되어 둘 다 추가가 가능해진다.
merge를 한 후, 저장을하면 *.orig 확장자로 backup파일을 생성해 놓은게 보인다. 문제는 이걸 수동으로 삭제해 줘야 한다. git clean이나 “find . -name ‘*.orig’ -delete’ 와 같은 리눅스 쉘 커맨드를 이용할 수도 있지만, 아예 백업파일을 생성하지 않도록 만드는 것도 가능하다.
git config --global mergetool.keepBackup false이렇게 해서 username 과 email을 포함해 6가지 git config에 대해 알아봤다. 지금까지 git config 명령어로 설정을 했지만, 파일을 직접 편집해도 된다. 내가 사용중인 .gitconfig 파일은 다음과 같다.
[safe]
directory = /mnt/NVMe M.2/output_files/\n
directory = *
[user]
name = batmask
email = batmask@naver.com
[core]
autocrlf = input
editor = vim
[diff]
tool = meld
[difftool]
prompt = false
[init]
defaultBranch = main
[cola]
startupmode = folder
[difftool "meld"]
cmd = meld \"$LOCAL\" \"$REMOTE\"
[merge]
tool = meld
[mergetool "meld"]
cmd = meld \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output \"$MERGED\"
[mergetool]
keepBackup = false