GPG bạn có thể ký cam kết cũ không?


93

Bây giờ Git có khả năng ký cam kết git commit -S, điều này thật tuyệt, nhưng đôi khi tôi quên cờ commitvà đôi khi tôi tự gửi các bản vá mà tôi áp dụng amvà lệnh đó không có cờ để ký.

Có cách nào để thêm chữ ký vào một cam kết đã được ghi lại không?


2
Đối với bản ghi, bạn có thể yêu cầu git luôn luôn ký xác nhận thông qua cấu hình : git config commit.gpgsign true.
nicooga

@nicooga Tôi muốn bình luận của bạn có nhiều upvote hơn vì vậy tôi nhận thấy điều này sớm hơn. Tôi đã phải đưa ra câu hỏi này ít nhất là nửa tá lần và đặt cờ đó sẽ giúp tôi tiết kiệm rất nhiều thời gian.
Michael Ziluck

Câu trả lời:


78
  1. Chuyển sang chế độ rebase tương tác.
  2. Thêm dòng sau mỗi cam kết bạn muốn đăng nhập

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

Điều này sẽ chạy lệnh này sau khi chọn từng cam kết.

CẬP NHẬT:

Cách dễ dàng hơn để làm điều này là:

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

Điều này khởi động lại mọi thứ cho đến khi phát triển (hoặc bất kỳ hàm băm nào) và bạn không phải sao chép dán sau mỗi lần xác nhận.


Đây chỉ là những gì tôi cần cho những gì sẽ là một tình huống thực sự tẻ nhạt, cảm ơn bạn!
msouth

2
Oh tôi ước tôi đã tìm thấy điều này sớm hơn. Tôi đã đọc rất nhiều điều, thậm chí từ chính GitHub, nói rằng bạn không thể từ bỏ các cam kết cũ. Điều này chứng tỏ rằng hoàn toàn sai! Tôi có thể đã lưu hàng trăm cam kết, mà bây giờ tôi đã bị nghiền nát. Oh well ... cảm ơn vì đã chia sẻ! Tôi đã thực hiện một bí danh từ điều này. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"trở thànhgit resign HASH
BarryMode

2
Đây là kiến ​​thức phổ biến! Bạn đã thực hiện một dịch vụ tuyệt vời cho nhân loại (không mỉa mai!)!
Hopeeekr

3
Không có lý do gì để nổi loạn cả. Chỉ cần chạy git commit --amend --no-edit -n -S.
Câu hỏi của Quolonel

9
Điều này không thay đổi lịch sử, đòi hỏi một git push --force?
Steve

33

Việc ký một cam kết thay đổi nội dung của nó, vì vậy các cam kết gần đây hơn tùy thuộc vào nó sẽ thay đổi hàm băm của chúng.

Nếu bạn chỉ muốn ký cam kết gần đây nhất, git commit -S --amendsẽ hoạt động.


13

Tôi sử dụng git rebase -i --root(xem Lịch sử viết lại ) và thay đổi pickthành edit.

Sau đó, tôi sử dụng git commit -S --amend --no-edit && git rebase --continue (trên Windows) cho mỗi lần xác nhận.

Đây là ký thủ công cho mỗi cam kết. Tôi hy vọng chúng tôi sẽ tìm thấy giải pháp tốt hơn.


Tôi có thư mục nhà của tôi là một repo git (cho dotfiles). Một số chương trình tương tác nhận các thay đổi khi nó nổi loạn, buồn cười khi thấy lịch sử được phát lại trực tiếp. Nó đủ chậm vì việc ký kết chậm
Avindra Goolcharan

2

Tôi cũng vấp phải vấn đề tương tự và đây là giải pháp của tôi:

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

điều này sẽ ký tất cả các cam kết của tôi từ lần xác nhận ban đầu đầu tiên và cũng bỏ qua hook hook mà tôi thiết lập bằng husky . Không cần phải đổi picksangedit .


1

Nếu bạn muốn chỉ lọc các cam kết cụ thể và chỉ ký chúng, bạn có thể sử dụng 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

Điều này hữu ích nếu, vì một số lý do, bạn muốn chỉ ký các cam kết của riêng bạn.


0

Nếu bạn cần ký GPG tất cả các cam kết SINCE một cam kết cụ thể trên nhánh hiện tại, bạn có thể sử dụng như sau:

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

Trong trường hợp <COMMIT>là phạm id (ví dụ abc123e5).

Điều này có thêm lợi ích là nó không làm phiền siêu dữ liệu cam kết (bao gồm cả ngày cam kết).

Nếu bạn cũng muốn ngừng nhận được lời nhắc cho cụm mật khẩu GPG của mình trên mỗi lần xác nhận, hãy xem câu trả lời này: https://askubfox.com/a/805550

LƯU Ý: Chuyển từ gpgsang gpg2để ký GIT sẽ yêu cầu bạn nhập lại khóa riêng của mình trong GPG 2.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.