git 버전관리에서는 git-commit으로 작업한 내용을 commit 단위로 저장할 수 있다.
git-log 커맨드로 레포지토리의 커밋 내역을 조회해보면 다음과 같은 정보를 포함하고 있다.
commit 35e5a96c728473cee9af87b5473a2ddfa88d1f67 (HEAD -> master)
Author: Jules Winfield<jules@pulp.fiction>
Date: Mon Mar 25 19:57:21 2024 +0900
Feat: Big Kahuna Burger
Hawaiian Burger Joint
이를 통해서 우리는 특정 파일에서 누가, 언제, 무엇을 커밋했는지 조회할 수 있고 이러한 변경 사항들의 누적을 통해 버전관리를 할 수 있다. 그렇지만 커밋에 대한 진위여부(integrity)는 보장할 수 있을까?
git-blame-someone-else라는 프로젝트를 한번 보자:

시연을 보면 특정 커밋 해시의 username과 email을 바꿀 수 있다!
다음 커밋 내역과 같이 리누스 토르발즈의 커밋을 확인할 수 있는데, 사실 이것은 실제 리누스의 커밋이 아니다!
이런 상황을 방지하기 위해서 git-commit을 서명하는 방법에 대해 알아보자!

마치 중요한 편지에서 씰링을 하듯이, 커밋 또한 서명을 할 수 있다!
Github에서는 서명된 commit은 다음과 같이 verified 배지가 표시된다.

서명을하기에 앞서 선행되어야할 작업들이 있다:
유효한 이메일로 Github 계정에 연결하기. (Github 이메일 설정)
global 또는 로컬 .git 디렉토리의 config에 이메일/이름 추가
# global 설정
$ git config --global user.email octocat@github.com
$ git config --global user.name octocat
# 로컬 설정
$ git config user.email octocat@github.com
$ git config user.name octocat
서명을 하기위해서는 서명을 할 공개 키를 만들어야하는데 이는 Gnu Privacy Guard(GPG)로 서명이 가능하다.
터미널에서 다음 커맨드를 실행하여 키 생성을 시작한다.
# GPG 버전 확인
$ gpg --version
# GPG 2.1.17 버전 이상
$ gpg --full-generate-key
# GPG 2.1.17 이하
$ gpg --default-new-key-algo rsa4096 --gen-key
프롬프트에서 키 종류 선택 또는 Enter로 기본값 지정
프롬프트에서 키 사이즈 지정 또는 Enter로 기본값 지정
프롬프트에서 키 만료시간 지정 또는 Enter로 기본값 지정
선택된 키 옵션 확인
이름 입력
이메일 입력 (Github에서 인증된 이메일 또는 Github에서 주어진 noreply 이메일 - 참조)
서명시 사용할 암호 입력
GPG 키 목록 조회
$ gpg --list-secret-keys --keyid-format=long
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid Hubot <hubot@example.com>
목록에서 사용할 GPG 키의 ID를 아래 커맨드에 입력:
$ gpg --armor --export 3AA5C34371567BD2
# ASCII armor 포맷으로 GPG Key 출력
git에 서명 키 추가:
# global 설정
git config --global user.signingkey 3AA5C34371567BD2
# 로컬 설정
git config user.signingkey 3AA5C34371567BD2
-----BEGIN PGP PUBLIC KEY BLOCK-----로 시작하여 -----END PGP PUBLIC KEY BLOCK-----로 끝나는 GPG 키를 복사한다.
Giuthub Access - SSH and GPG Keys 설정 페이지로 이동한다.
GPG Keys 섹션에서 New GPG Key를 클릭하여 복사한 GPG 키를 등록한다.
git-commit 서명하기:
-S 옵션으로 커밋 서명이 가능하다.
git commit -S -m "커밋 메시지"
# 서명된 commit을 생성한다
# 커밋시 GPG 키 생성에 등록한 비밀번호 프롬프트가 나온다
(선택) 항상 모든 커밋에 서명을하고 싶다면 아래 같은 설정을 추가하면된다.
git config --global commit.gpgsign true