GPG 키를 사용하여 Git에서 커밋을 "자동 서명"하는 방법이 있습니까?


213

Git이 생성 된 각 커밋 또는 태그에 항상 서명하도록하는 쉬운 방법이 있습니까?

나는 다음과 같이 시도했다.

별명 커밋 = 커밋 -S

그러나 그것은 속임수를 쓰지 않았습니다.

이를 위해 다른 프로그램을 설치하고 싶지 않습니다. 쉽게 할 수 있습니까?

부수적 인 질문, 아마도 커밋에 서명해서는 안되며 Homebrew와 같은 프로젝트에 대해 단일 커밋을 제출할 때 절대로 태그를 작성해서는 안됩니다.


8
별칭이 작동 한 이유는 이미 존재하는 명령에 대해 별칭을 지정할 수 없기 때문입니다. (관련 : stackoverflow.com/questions/5875275/git-commit-v-by-default stackoverflow.com/questions/2500586/...의 stackoverflow.com/questions/1278296/... )
댄 D.

2
정보를 위해 : 모든 커밋을 다시 작성하여 서명하도록하십시오. git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD@{u}..HEAD(이것을 사용해야한다는 의미는 아닙니다.)
Vi.

답변:


275

참고 : -S커밋이 서명되었는지 확인하기 위해 항상 추가하지 않으려면 제안을해야합니다 ( pu지금은 분기 ' ', 2013 년 12 월이므로 git 릴리스로 만들 것이라고 보장하지 않습니다). 해당 옵션을 처리하는 config.
2014 년 5 월 업데이트 : Git 2.0에 있습니다 ( 이 패치 시리즈에서 다시 보낸 후 )

참조 2af2ef3 커밋 에 의해 니콜라스 비지에 (boklm) :

commit.gpgsign모든 커밋에 서명 하는 옵션 추가

모든 커밋에 GPG 서명을하려면 -S옵션을 항상 추가해야합니다 . 설정 옵션은 자동으로 모든 커밋에 서명 할 수 있습니다.
commit.gpgsign

commit.gpgsign

모든 커밋을 GPG 서명해야하는지 여부를 지정하는 부울입니다.
rebase와 같은 작업을 수행 할 때이 옵션을 사용하면 많은 수의 커밋이 서명 될 수 있습니다. GPG 암호 문구를 여러 번 입력하지 않도록 에이전트를 사용하는 것이 편리 할 수 ​​있습니다.


해당 구성은 일반적으로 저장소마다 설정됩니다 (개인 실험 로컬 저장소에 서명 할 필요는 없음).

cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true

user.signingKey전역 설정 으로 사용하는 것과 결합 합니다 (커밋에 서명하려는 모든 리포지토리에 사용되는 고유 키)

git config --global user.signingkey F2C7AB29

user.signingKey커밋 d67778e 와 함께 git 1.5.0 (2007 년 1 월)에 도입되었습니다 .

내 자식 저장소와 gpg 키에 동일한 형식의 이름을 사용해야한다는 요구 사항이 없어야합니다.
또한 키 링에 여러 키가있을 수 있으며 커밋 메시지에 사용하는 주소와 일치하지 않는 키를 사용하려고 할 수 있습니다.

이 패치는 구성 항목 " user.signingKey"을 추가합니다.이 항목이 있으면 gpg의 "-u"스위치로 전달되어 태그 서명 키를 재정의 할 수 있습니다.

이것은으로 적용됩니다 커밋 aba9119 사용자가 잘못 된 경우 경우 잡기 위해 (자식 1.5.3.2) user.signingKey자신의에서 .git/config자신의 열쇠 고리에 어떤 비밀 키가없는 단지 또는.

노트:


정말 멋지다. github에서 구멍 저장소를 다운로드하지 않고도 git describe와 같은 쉬운 방법이 있습니까?

13
개인 실험 저장소에 서명 할 필요는 없지만 왜 그렇지 않습니까?
Andy Hayden

168
git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

키 ID로 9E08524833CB3038FDE385C54C0AFCCFED5CDE14를 바꾸십시오. 기억하십시오 : 짧은 ID를 사용하는 것은 좋은 생각이 아닙니다 .

업데이트 : 새로운 git edict 당 모든 구성 키는 camelCase에 있어야합니다.


VonC의 답변 에서 복사하여 붙여 넣었 습니까?
Robbie Averill

19
아니요. 판 역사에서 볼 수 있듯이 누군가가 그의 대답에 내 예를 추가했습니다. ED5CDE14는 내 개인 키입니다. 그러나 문제 없습니다.
Felipe

7
기괴한. 나는 당신을 위해 나쁜 보이는 내일의 변화를 되돌아갑니다
로비 에버 릴에게

키 서명 ID는 어떻게 찾습니까? 또한 모든 내 git repos에 대해 하나의 GPG 키를 가지고 있습니까? 꽤 연결된 프로젝트에서 4 개의 diff 키를 다루지 않아도되기를 선호하기 때문입니다.
MarcusJ

1
이것은 Linux 사용자에게 도움이 될 수 있습니다 : 어떤 경우에는 (예 : Vim에서 PIN 입력이 필요한 스마트 카드에 저장된 키를 사용하여) 작동하도록하려면 편집 ~/.gnupg/gpg-agent.conf하고 추가해야합니다 pinentry-program /usr/bin/pinentry-gtk-2(이 안내서 wiki.archlinux.org/ index.php / GnuPG # pinentry )
iakovos Gurulian

49

편집 : 힘내 버전 1.7.9로, 이다 가능 (힘내 커밋에 서명git commit -S ). 이것을 반영하기 위해 답변을 약간 업데이트하십시오.

질문 제목은 다음과 같습니다.

GPG 키를 사용하여 Git에서 커밋을 "자동 서명"하는 방법이 있습니까?

짧은 대답 : 예,하지만하지 마십시오.

문제의 오타를 해결 : git commit -s커밋에 서명하지 않습니다. 오히려 man git-commit페이지에서 :

-s, --signoff
커밋 로그 메시지 끝에 커미터가 서명 한 줄을 추가합니다.

이것은 다음과 유사한 로그 출력을 제공합니다.


± $ git log                                                                                 [0:43:31]
commit 155deeaef1896c63519320c7cbaf4691355143f5
Author: User Name 
Date:   Mon Apr 16 00:43:27 2012 +0200

    Added .gitignore

    Signed-off-by: User Name 

"Signed-off-by ::"비트를주의하십시오. 그 -s깃발에 의해 생성 된git-commit .

출시 발표 이메일 인용 :

  • "git commit"은 커밋을 GPG 서명하기 위해 "-S"를 배웠다. 이것은 "--show-signature"옵션과 함께 "git log"로 표시 될 수 있습니다.

예, 커밋에 서명 할 수 있습니다. 그러나 저는이 옵션에 개인적으로주의를 기울입니다. 커밋 자동 서명은 무의미한 옆에 있습니다. 아래를 참조하십시오.

부수적 인 질문, 아마도 커밋에 서명해서는 안되며, 단일 커밋을 제출할 때 절대 태그를 만들지 않을 것입니다.

맞습니다. 커밋은 서명되지 않습니다. 태그입니다. 이에 대한 이유는 Linus Torvalds 가이 메시지에서 찾을 수 있습니다 .

각 커밋에 서명하는 것은 완전히 어리 석습니다. 그것은 당신이 그것을 자동화한다는 것을 의미하며, 서명을 덜 가치있게 만듭니다. SHA1의 git DAG-chain이 작동하는 방식으로, 그 중 하나에서 도달 가능한 모든 커밋을 효과적으로 적용 할 수 있도록 하나의 서명 만 있으면됩니다 . 따라서 각 커밋에 서명하는 것은 요점이 없습니다.

커밋에 자동으로 서명하는 것이 내가 할 수있는 것보다 훨씬 좋은 방법이 아닌 이유 를 분명히하는 링크 된 메시지를 찾아 보는 것이 좋습니다.

그러나 태그 에 자동으로 서명 git-tag -[s|u]하려면 별명 으로 래핑하여이를 수행 할 수 있습니다 . 그렇게하려면 키 ID ~/.gitconfig또는 프로젝트 특정 .git/config파일 을 설정하고 싶을 것입니다 . 이 프로세스에 대한 자세한 내용은 git 커뮤니티 책 에서 볼 수 있습니다 . 서명 태그는 커밋마다 서명하는 것보다 훨씬 유용합니다.


74
"각 커밋에 서명하는 것은 완전히 바보입니다." -> 가짜 저자 및 커미터로 커밋을 푸시하는 것을 좋아하는 "rat"개발자가있을 때 커밋을 보호하는 더 좋은 방법은 무엇입니까? 서버에 후크 마법이 없으면 git blame원하는 사람에게 지시 할 수 있습니다 .
Vi.

11
0 기사 > 어떻게 주장 "이야기하기 - 1."그들 모두에 서명하기에 충분하다 " 이것은 정말 . DIFF (그러나 이전 및 추가 커밋에 대한 확신이) 나에 서명을 데려 가고 싶다는 커밋 2. 신뢰할 수없는 환경에서 누가 유죄인지 알아볼 수있는 신뢰할 수있는 도구가 있어야합니다. 서버가 모든 커밋이 커미터의 전자 메일 키로 서명되었는지 확인하는 경우 커밋을 위조하기 어렵습니다 (컴퓨터를 잘 보호하는 경우)
Vi.

9
코드가 절대 변경되지 않으면 하나의 커밋에 서명하면 충분합니다. 커밋을 더 추가하면 더 많은 서명이 필요합니다. 태그에 서명하면 해당 커밋보다 오래된 것을 모두 표시합니다. 커밋이 올 때 세밀한 검증이 필요한 경우 각 커밋에 서명하는 것이 좋습니다. 그렇지 않으면 많은 태그를 사용해야하므로 리포지토리가 복잡해집니다. 인증 된 원격 자식 저장소에서는 태그를 누를 때뿐만 아니라 커밋을 누를 때마다 암호 또는 ssh 키를 제공해야합니다. 이것은 비슷한 상황입니다.
Hans-Christoph Steiner

22
Linus가 요점을 놓친 것 같습니다. 그는 해당 스레드의 OP와 서명 된 커밋을 염두에두고 완전히 다른 유스 케이스를 가지고있는 것 같습니다. (전체 커밋의 무결성을 확인하고 단일 커밋의 소유권을 확인하는 것)
Ajedi32

9
"그렇지만하지 마십시오"는 -1입니다. 답은 평평한 "YES"여야합니다. 커밋에 서명하면 저자가 커밋에서 거짓말을 할 수있는 것을 증명합니다.
Urda

6

자동 서명이 git 버전 2.0 이전에 작동하게하려면 커밋을 위해 git alias를 추가해야합니다.

# git config --global alias.commit commit -S
[alias]
    commit = commit -S

0

커밋 또는 태그에 서명 한 경우 전체 기록을 승인한다는 의미는 아닙니다. 커밋의 경우 변경 사항에 서명하고 태그의 경우에만 서명하십시오. 의미가 무엇인지 정의해야합니다. 변경 내용을 가져 왔을 수도 있지만 그렇지 않은 경우도 있습니다 (다른 사람이 리모컨으로 푸시했기 때문). 또는 원하지 않는 변경 사항이지만 태그에 서명했습니다.

일반적인 OSS 프로젝트에서는 이것이 일반적이지 않을 수 있지만, 지금은 코드 만 터치하고 전체 기록을 읽지 않는 엔터프라이즈 시나리오에서는 눈에 띄지 않을 수 있습니다.

커밋에 서명하는 것은 다른 부모에게 리베이트되거나 체리 피킹 될 경우 문제가됩니다. 그러나 수정 된 커밋이 실제로 확인하는 "원본"커밋을 가리킬 수 있다면 좋을 것입니다.


3
Rebasing은 거짓말과 같습니다. 매우 드물게 사용해야합니다. 다른 하나는 서명으로 커밋하는 것이 "로그 오프"코드이므로 a) 안티 CYA가 아니고 b) 노력을 낭비하지 않아야합니다.

11
@Barry“리베이스는 거짓말과 같습니다. 지나치게 드물게 사용해야합니다.”– 이것은 사실이 아닙니다. Rebase 기반 워크 플로우는 병합 기반 워크 플로우만큼이나 유효합니다. Rebasing은 너무 강력해서 드물게 사용할 수 없습니다.
Lukas Juhrich

1
이것이 문제가 아닌 GitHub와 함께 독점적으로 사용하는 경우 GitHub가이를 지원하지 않기 때문에 병합 커밋에 서명하지 않습니다. 이 환경에서 모든 (병합되지 않은) 커밋에 서명하는 장점은 GPG 키로 서명되지 않기 때문에 PR을 통해 불량 커밋이 추가 된 시점이 매우 분명하다는 것입니다.
Arran Cudbard-Bell

3
"커밋 또는 태그에 서명하면 (전체 기록에 모두 서명 할 수 있습니다.) 변경 내용을 가져 왔을 수도 있습니다. 커밋에 서명 만한다면 당신에게서 도달 할 수있는 모든 커밋의 승인. 귀하는 과거의 변경 사항이 귀하에 의해 유효하거나 보증되었다고 반드시 진술 할 필요는 없으며, 해당 변경 사항을 기반으로 커밋을 생성 한 것입니다. (태그를 사용하더라도 태그를 통해 도달 할 수있는 모든 커밋에 실제로 서명한다는 것에 동의합니다.)
Ajedi32

1
@ ArranCudbard-Bell commit.gpgsign@VonC
Jay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.