GPG 키를 사용하여 Git에서 커밋을 “자동 서명”하는 방법이 있습니까? 서명하도록하는 쉬운 방법이 있습니까? 나는 다음과 같이

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

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

별명 커밋 = 커밋 -S

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

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

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



답변

참고 : -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자신의 열쇠 고리에 어떤 비밀 키가없는 단지 또는.

노트:


답변

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

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

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


답변

편집 : 힘내 버전 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 커뮤니티 책 에서 볼 수 있습니다 . 서명 태그는 커밋마다 서명하는 것보다 훨씬 유용합니다.


답변

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

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

답변

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

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

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