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