GPG에 기존 커밋에 서명 할 수 있습니까?


93

Git은 이제 커밋에 서명 할 수있는 기능을 가지고 git commit -S있지만 때로는 플래그를 잊어 버리고 commit때로는 자신에게 적용하는 패치를 메일로 보내며 am해당 명령에는 서명 플래그가 없습니다.

이미 기록 된 커밋에 서명을 추가하는 방법이 있습니까?


2
레코드의 경우 git에게 항상 구성을 통해 커밋에 서명하도록 지시 할 수 있습니다 git config commit.gpgsign true.
nicooga

@nicooga 귀하의 의견에 더 많은 의견이 있었기를 바랍니다. 나는이 질문을 적어도 6 십 번 잡아 당겨야했다. 그리고 그 깃발을 설정하면 많은 시간을 절약 할 수 있었다.
Michael Ziluck

답변:


78
  1. 대화식 리베이스 모드로 이동하십시오.
  2. 서명하려는 커밋마다 다음 줄을 추가하십시오.

    exec git commit --amend --no-edit -S

각 커밋을 선택한 후이 명령을 실행합니다.

최신 정보:

더 쉬운 방법은 다음과 같습니다.

git rebase --exec 'git commit --amend --no-edit -n -S' -i development

이것은 개발 (또는 해시)까지 모든 것을 리베이스하고 모든 커밋 후에 붙여 넣기 할 필요가 없습니다.


이것은 정말 지루한 상황에 필요한 것이 었습니다. 감사합니다!
msouth

2
아, 이걸 빨리 찾았 으면 좋겠다. 나는 GitHub 자체 에서조차 많은 것을 읽었으며, 당신은 오래된 커밋을 사임 할 수 없다고 말합니다. 이것은 완전히 거짓임을 증명합니다! 나는 수백 개의 커밋을 구할 수 있었는데, 지금 나는 그것을 저 버렸다. 오 잘 ... 공유해 주셔서 감사합니다! 나는 이것으로 별명을 만들었다. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"됩니다git resign HASH
BarryMode

2
이것은 상식이어야합니다! 당신은 인류를 위해 훌륭한 봉사를했습니다 (사르 크는 없습니다!)!
hopeseekr

3
전혀 리베이스 할 이유가 없습니다. 그냥 실행하십시오 git commit --amend --no-edit -n -S.
Quolonel Questions

9
이것은 역사를 바꾸지 git push --force않습니까?
Steve

33

커밋에 서명하면 내용이 변경되므로 최신 커밋에 따라 해시가 변경됩니다.

가장 최근의 커밋에 서명하고 싶다면 git commit -S --amend작동합니다.


13

사용하고 git rebase -i --root( 기록 다시 작성 참조 )로 변경 pick하십시오 edit.

그런 다음 각 커밋마다 git commit -S --amend --no-edit && git rebase --continue (Windows에서) 사용 합니다.

이것은 커밋마다 수동으로 서명됩니다. 더 나은 해결책을 찾길 바랍니다.


내 홈 디렉토리를 git repo (dotfiles)로 사용합니다. 일부 프로그램은 대화식으로 변경 사항을 대화식으로 선택하여 역사가 실시간으로 재생되는 것을보고 재미 있습니다. 서명이 느리기 때문에 충분히 느리다
Avindra Goolcharan

2

나는 또한 같은 문제를 발견했으며 여기에 내 해결책이 있습니다.

git rebase -i --root --exec 'git commit --amend --no-edit --no-verify -S'

이것은 첫 번째 초기 커밋에서 내 커밋에 모두 서명하고 husky 사용하여 설정 한 커밋 후크무시 합니다. 필요 없음 변경 .pickedit


1

특정 커밋 만 필터링하고 서명 만하려면 다음을 사용할 수 있습니다 filter-branch.

git filter-branch --commit-filter 'if [ "$GIT_COMMITTER_EMAIL" = "user@domain.com" ];
  then git commit-tree -S "$@";
  else git commit-tree "$@";
  fi' HEAD

어떤 이유로 든 커밋에만 서명하려는 경우에 유용합니다.


0

현재 브랜치에서 특정 커밋 이후 모든 커밋을 GPG 서명 해야하는 경우 대신 다음을 사용할 수 있습니다.

git filter-branch --commit-filter 'git commit-tree -S "$@";' <COMMIT>..HEAD

<COMMIT>커밋 ID는 어디에 있습니까 (예 :) abc123e5.

커밋 메타 데이터 (커밋 날짜 포함)를 방해하지 않는다는 추가 이점이 있습니다.

모든 커밋에서 GPG 암호 문구를 묻는 메시지를 표시하지 않으려면 https://askubuntu.com/a/805550 도 참조하십시오.

참고 : GIT 서명 gpggpg2위해로 전환 하려면 GPG 2에서 개인 키를 다시 가져와야합니다.

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