คุณสามารถลงนามในสัญญา GPG เก่าได้หรือไม่?


93

ตอนนี้ Git มีความสามารถในการเซ็นสัญญาด้วยgit commit -Sซึ่งยอดเยี่ยม แต่บางครั้งฉันก็ลืมธงcommitและบางครั้งฉันส่งแพตช์ที่ฉันสมัครด้วยamและคำสั่งนั้นไม่มีแฟล็กสำหรับลงชื่อ

มีวิธีการเพิ่มลายเซ็นให้กับการกระทำที่บันทึกไว้แล้วหรือไม่?


2
git config commit.gpgsign trueสำหรับบันทึกที่คุณสามารถบอกคอมไพล์เสมอลงชื่อกระทำผ่านการกำหนดค่า:
นิโคกา

@nicooga ฉันต้องการความคิดเห็นของคุณมี upvotes มากขึ้นฉันจึงสังเกตเห็นสิ่งนี้ก่อนหน้านี้ ฉันต้องดึงคำถามนี้มาอย่างน้อยครึ่งโหลและการตั้งค่าสถานะนั้นจะช่วยฉันได้หลายครั้ง
Michael Ziluck

คำตอบ:


78
  1. เข้าสู่โหมดรีบูตแบบโต้ตอบ
  2. เพิ่มบรรทัดต่อไปนี้หลังจากการส่งแต่ละครั้งที่คุณต้องการลงชื่อ

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

นี้จะเรียกใช้คำสั่งนี้หลังจากเลือกแต่ละการกระทำ

UPDATE:

วิธีที่ง่ายกว่าในการทำเช่นนี้คือ:

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
นี่ควรเป็นความรู้ทั่วไป! คุณได้ทำสิ่งที่ดีเยี่ยมเพื่อมนุษยชาติ (ไม่มีการเสียดสี!)!
hopeeekr

3
ไม่มีเหตุผลใดที่จะลดราคาเลย git commit --amend --no-edit -n -Sเพียงแค่เรียกใช้
คำถามของ Quolonel

9
สิ่งนี้ไม่ได้เปลี่ยนประวัติศาสตร์git push --forceหรือไม่?
Steve

33

การเซ็นชื่อคอมมิชชันเปลี่ยนแปลงเนื้อหาของมันดังนั้นการคอมมิทชั่นล่าสุดขึ้นอยู่กับว่ามันจะเปลี่ยนแฮช

หากคุณเพียงแค่ต้องการที่จะเซ็นสัญญากระทำล่าสุดgit commit -S --amendจะทำงาน


13

ผมใช้git rebase -i --root(ดูการเขียนใหม่ประวัติ ) และเปลี่ยนไปpickedit

จากนั้นฉันก็ใช้git commit -S --amend --no-edit && git rebase --continue (บน Windows)สำหรับแต่ละการกระทำ

นี่คือการเซ็นชื่อด้วยตนเองสำหรับแต่ละการกระทำ ฉันหวังว่าเราจะพบทางออกที่ดีกว่า


ฉันมีไดเรกทอรีบ้านของฉันเป็น repo คอมไพล์ (สำหรับ dotfiles) บางโปรแกรมมีการโต้ตอบรับการเปลี่ยนแปลงในขณะที่การรีบูตมันตลกเพื่อดูประวัติศาสตร์ที่มีการเล่นซ้ำสด มันช้าพอเพราะการลงชื่อช้า
Avindra Goolcharan

2

ฉันยังสะดุดกับปัญหาเดียวกันและนี่คือทางออกของฉัน:

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

นี้จะลงนามกระทำทั้งหมดของฉันจากการเริ่มต้นครั้งแรกที่กระทำและหลีกเลี่ยงการกระทำเบ็ดที่ผมตั้งค่าการใช้แหบแห้ง ไม่จำเป็นต้องมีการเปลี่ยนแปลง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

หมายเหตุ: การเปลี่ยนจากgpgเป็นการgpg2เซ็นชื่อ GIT คุณจะต้องนำเข้าคีย์ส่วนตัวใน GPG 2 อีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.