본문 바로가기

잡다/git

[git] WSL2 환경에서의 글로벌 .gitconfig

 WSL2 ubuntu 20.04 환경에서 깃허브를 이용하기 위해 커밋을 진행하고 있는데, 어느 순간 다음과 같은 에러를 발생시키면서 커밋을 실패했다.

error: insufficient permission for adding an object to repository database .git/objects
error: .github/workflows/deploy.yml: failed to insert into database
error: unable to index file '.github/workflows/deploy.yml'
fatal: updating files failed

 대략 권한 문제가 있다는 메세지로 보여서 sudo 명령으로 커밋을 진행하기로 했다.

그랬더니 커밋 자체는 제대로 수행되지만, 또 다른 경고 메시지가 발생한다.

발생한 경고 메시지. 

 대략 사용자의 name 및 email이 기본 값으로 지정되어 있다고 설명하고 있어, log 명령어를 통해 해당 메시지의 의미에 대해 살펴보기로 했다.

최근 commit의 author이 blaxsior이 아닌 다른 이름으로 설정되어 있다.

 분명 동일한 commit을 수행한 것 같은데 왜 이런 일이 발생할까? 이유는 sudo 명령어의 특징에 있다. sudo는 UNIX-like OS 환경에서 유저에게 프로그램을 슈퍼 유저(root, admin 등) 의 권한을 부여하여 프로그램을 실행할 수 있도록 만들어주는 프로그램으로, superuser do 의 준말이라고 한다. 즉, sudo 명령어를 이용하면 해당 명령은 현재 로컬 유저가 아닌 슈퍼 유저인 root 의 권한을 이용한 것으로 간주되기 때문에, /home/user 폴더에 있는 .gitconfig 파일의 설정을 따르는 대신 root 유저가 가진 .gitconfig 의 설정을 따르게 되는 것이다.

sudo git config --global -e 를 수행한 결과.
git config --global -e 를 수행한 결과.

 이런 결과는 sudo 명령어의 동작 방식에 명확히 부합하기는 하나, 대부분의 사람들은 그냥 sudo 명령어를 이용해도 기존과 동일한 결과가 나오기를 바랄 것이다. 다행히 유저 정보를 넣는 동작 정도는 git의 -c 옵션을 통해 가능하다.

 git 명령어 이후 -c 옵션을 통해 값을 key=value 형태로 전달하면, .gitconfig의 내용을 전달된 내용으로 덮어쓴다. 위 경우에는 user.name 및 user.email을 덮어쓰고 있다. 위와 같이 sudo git -c ~ 에 해당하는 내용을 linux의 alias 으로 등록해두면 나중에 사용하기 편할 것이다.

 symbolic link 등으로 그냥 두개의 파일을 하나로 관리하는 방법도 가능할 것 같기는 한데, root 유저의 설정 파일을 로컬 유저의 설정과 동기화 시키는 것이 과연 좋은 방법일까 하는 생각이 들어 굳이 시도하지는 않겠다.


결론

 sudo를 이용하면 root(관리자) 의 권한을 이용하므로, 관리자 환경을 사용하게 된다. 이때 .gitconfig 파일은 각각의 유저마다 소유하는데, root도 이러한 유저의 범주에 포함되어 별개의 .gitconfig 파일을 소유하는 것으로 보인다. 따라서 sudo를 통해 git 명령 ( commit ) 등을 수행하면 root가 소유한 .gitconfig 에 지정된 설정을 사용하기 때문에 이러한 동작을 원하지 않는다면 -c/-C 등의 옵션을 통해 환경 설정을 오버라이딩하여 사용해야 한다.

'잡다 > git' 카테고리의 다른 글

[git] git commit message convention  (0) 2023.08.02
[Git 09] Stash  (0) 2021.12.28
[Git 08] 브랜치  (0) 2021.12.28
[Git 07] 서버  (0) 2021.12.27
[Git 06] Alias  (0) 2021.10.31