Git 커밋 시 발생하는 'gpg: database_open waiting for lock' 에러 원인과 해결 방법
Problem
Git에서 커밋에 GPG 서명을 추가하도록 설정한 환경(예: RStudio, 터미널 등)에서 커밋을 시도할 때, 무한 로딩에 빠지며 타임아웃이 발생하는 경우가 있습니다. 이때 터미널에 gpg: Note: database_open [숫자] waiting for lock (held by [PID])와 같은 에러 메시지가 반복해서 출력됩니다. 많은 개발자들이 이를 권한 문제로 오해하여 인증 토큰을 재발급하거나 저장소를 다시 클론해보지만, 문제는 전혀 해결되지 않고 커밋이 블로킹되는 답답한 상황을 겪게 됩니다.
Background
Git은 커밋의 신뢰성을 보장하고 작성자를 증명하기 위해 GPG(GNU Privacy Guard) 키를 사용하여 커밋에 암호화된 서명을 남길 수 있습니다. GPG는 키링 데이터베이스를 읽고 쓸 때 데이터 무결성을 보호하기 위해 ‘Lock(잠금) 파일’을 생성하여 다른 프로세스가 동시에 접근하지 못하도록 막습니다.
만약 커밋 도중 컴퓨터가 비정상 종료되거나 GPG 프로세스(에러 메시지에 명시된 PID)가 크래시되면, 이 Lock 파일이 정상적으로 삭제되지 않고 파일 시스템에 남게 됩니다. 이후 새로운 커밋을 시도할 때 GPG는 이전 프로세스가 여전히 데이터베이스를 사용 중인 것으로 오인하여 무한정 대기(waiting for lock) 상태에 빠지게 되는 것입니다.
Solution
이 문제는 Git의 인증 정보나 토큰 문제가 아니므로, 단순히 Git의 GPG 서명 기능을 끄는 것은 근본적인 해결책이 아닙니다. 시스템에 비정상적으로 남아있는 Lock 파일을 찾아 수동으로 제거해야 합니다.
1. 프로세스 및 Lock 파일 상태 확인
먼저 에러 메시지에 나타난 프로세스 ID(PID)가 실제로 실행 중인지 확인하고, GPG 디렉토리에 Lock 파일이 남아있는지 점검합니다.
# 에러 메시지에 나온 PID(예: 9857)가 현재 실행 중인 프로세스인지 확인합니다.
# 아무 출력도 없다면 프로세스가 이미 죽은 상태(비정상 종료)를 의미합니다.
ps -p 9857
# GPG 공개키 디렉토리의 숨김 파일을 포함한 목록을 확인합니다.
ls -al ~/.gnupg/public-keys.d
2. Lock 파일 수동 삭제
문제를 해결하는 가장 확실한 방법은 꼬여버린 Lock 파일을 삭제하여 GPG가 다시 데이터베이스에 접근할 수 있도록 풀어주는 것입니다.
# 메인 Lock 파일인 pubring.db.lock을 삭제합니다.
rm ~/.gnupg/public-keys.d/pubring.db.lock
# 프로세스 번호가 붙은 임시 Lock 파일(.#lk0x로 시작하는 파일)들도 모두 삭제합니다.
# 에러를 유발했던 찌꺼기 파일들입니다.
rm ~/.gnupg/public-keys.d/.#lk0x*
위 명령어들을 실행하여 Lock 파일들을 성공적으로 지웠다면, 다시 git commit을 시도해 보세요. GPG 서명이 정상적으로 진행되고 커밋이 완료될 것입니다.
Deep Dive
GPG 서명 에러를 예방하려면 커밋 중 터미널을 강제 종료하거나 IDE(RStudio, VSCode 등)를 비정상적으로 끄지 않도록 주의해야 합니다. 또한, Mac 환경에서는 pinentry-mac 프로그램이 백그라운드에서 멈춰 비밀번호 입력 프롬프트를 띄우지 못해 타임아웃이 발생하는 경우도 잦습니다. 이럴 때는 Lock 파일 삭제와 더불어 killall gpg-agent 명령어로 GPG 에이전트를 강제 종료하고 재시작하여 캐시된 상태를 초기화하는 것이 좋은 트러블슈팅 방법입니다. CI/CD 환경(GitHub Actions 등)에서 이 문제가 발생한다면, 이전 스텝에서 GPG 프로세스가 비정상 종료되지 않았는지 파이프라인 로그를 꼼꼼히 점검해야 합니다.
Conclusion
gpg: database_open waiting for lock 에러는 GPG 프로세스의 비정상 종료로 인해 남겨진 Lock 파일 때문에 발생하는 시스템 상태 오류입니다. 권한이나 토큰 재설정으로 시간을 낭비하지 말고, ~/.gnupg/public-keys.d/ 경로에 남아있는 .lock 및 임시 파일들을 찾아 삭제해 주면 문제를 즉시 해결할 수 있습니다.