Apakah ada cara untuk "autosign" melakukan di Git dengan kunci GPG?

213

Apakah ada cara mudah untuk membuat Git selalu menandatangani setiap komit atau tag yang dibuat?

Saya mencobanya dengan sesuatu seperti:

alias commit = commit -S

Tapi itu tidak berhasil.

Saya tidak ingin menginstal program lain untuk mewujudkannya. Apakah bisa dilakukan dengan mudah?

Hanya pertanyaan sampingan, mungkin komit tidak boleh ditandatangani, hanya tag, yang tidak pernah saya buat, karena saya mengirimkan satu komit untuk proyek seperti Homebrew, dll.

MindTooth
sumber
8
Alasan alias Anda berhasil adalah karena Anda tidak dapat alias atas perintah yang sudah ada. (terkait: stackoverflow.com/questions/5875275/git-commit-v-by-default stackoverflow.com/questions/2500586/... stackoverflow.com/questions/1278296/… )
Dan D.
2
Sekadar info: Tulis ulang semua komitmen untuk didorong untuk menandatanganinya: git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD@{u}..HEAD(Saya tidak bermaksud Anda harus menggunakan ini).
Vi.

Jawaban:

275

Catatan: jika Anda tidak ingin menambahkan -Ssemua waktu untuk memastikan komit Anda ditandatangani, ada proposal (cabang ' pu' untuk saat ini, Desember 2013, jadi tidak ada jaminan akan membuatnya ke rilis git) untuk menambahkan config yang akan menangani opsi itu untuk Anda.
Pembaruan Mei 2014: ada di Git 2.0 (setelah dikirim ulang dalam seri tambalan ini )

Lihat commit 2af2ef3 oleh Nicolas Vigier (boklm) :

Tambahkan commit.gpgsignopsi untuk menandatangani semua komitmen

Jika Anda ingin GPG menandatangani semua komitmen Anda, Anda harus menambahkan -Sopsi setiap saat.
The commit.gpgsignpilihan konfigurasi memungkinkan untuk menandatangani semua komit secara otomatis.

commit.gpgsign

Boolean untuk menentukan apakah semua komitmen harus ditandatangani GPG.
Penggunaan opsi ini saat melakukan operasi seperti rebase dapat mengakibatkan sejumlah besar komitmen ditandatangani. Mungkin nyaman menggunakan agen untuk menghindari mengetikkan frasa sandi GPG Anda beberapa kali.


Konfigurasi itu biasanya disetel per repo (Anda tidak perlu menandatangani repo lokal eksperimental pribadi Anda):

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

Anda akan menggabungkannya dengan user.signingKeydigunakan sebagai pengaturan global (kunci unik yang digunakan untuk semua repo tempat Anda ingin menandatangani komit)

git config --global user.signingkey F2C7AB29

user.signingKeydiperkenalkan di git 1.5.0 (Jan. 2007) dengan commit d67778e :

Seharusnya tidak ada persyaratan bahwa saya menggunakan bentuk nama yang sama di repositori git dan kunci gpg saya.
Lebih lanjut, saya mungkin memiliki beberapa kunci di keyring saya, dan mungkin ingin menggunakan satu yang tidak cocok dengan alamat yang saya gunakan dalam pesan komit.

Patch ini menambahkan entri konfigurasi "user.signingKey " yang, jika ada, akan diteruskan ke saklar "-u" untuk gpg, yang memungkinkan kunci penandatanganan tag ditimpa.

Ini diberlakukan dengan commit aba9119 (git 1.5.3.2) untuk mengetahui kasus di mana Jika pengguna telah salah mengonfigurasiuser.signingKey di mereka.git/config atau hanya tidak memiliki kunci rahasia pada keyring mereka.

Catatan:

VONC
sumber
Itu keren sekali. Apakah ada cara mudah di github melakukan sesuatu seperti git mendeskripsikan tanpa harus mengunduh lubang repo?
13
Anda tidak perlu menandatangani repo eksperimental pribadi Anda ... tetapi mengapa tidak?
Andy Hayden
168
git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

Ganti 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 dengan ID kunci Anda. Ingat: Tidak pernah merupakan ide yang baik untuk menggunakan ID singkat .

UPDATE: Per edit git baru , semua kunci konfigurasi harus di camelCase.

Felipe
sumber
Apakah Anda hanya menyalin dan menempel ini dari jawaban VonC ?
Robbie Averill
19
Tidak. Seperti yang Anda lihat dalam sejarah edisi, seseorang telah menambahkan contoh saya dalam jawabannya. ED5CDE14 adalah kunci pribadi saya sendiri. Tapi tidak masalah.
Felipe
7
Aneh. Saya akan mengembalikan perubahan besok karena terlihat buruk bagi Anda
Robbie Averill
Bagaimana Anda menemukan ID penandatanganan kunci Anda? juga, apakah hanya memiliki 1 kunci GPG untuk semua repositori git saya buruk? karena saya lebih suka untuk tidak harus berurusan dengan 4 kunci berbeda dalam proyek yang cukup terhubung.
MarcusJ
1
Ini mungkin membantu pengguna Linux: Untuk membuatnya berfungsi dalam beberapa kesempatan (misalnya pada Vim, menggunakan kunci yang disimpan dalam kartu pintar yang memerlukan entri PIN) saya harus mengedit ~/.gnupg/gpg-agent.confdan menambahkan pinentry-program /usr/bin/pinentry-gtk-2(mengikuti panduan ini wiki.archlinux.org/ index.php / GnuPG # pinentry )
iakovos Gurulian
49

Edit: Pada Git versi 1.7.9, itu adalah mungkin untuk menandatangani Git komit (git commit -S ). Memperbarui sedikit jawabannya untuk mencerminkan hal ini.

Judul pertanyaannya adalah:

Apakah ada cara untuk "autosign" melakukan di Git dengan kunci GPG?

Jawaban singkat: ya, tapi jangan lakukan itu.

Mengatasi kesalahan ketik dalam pertanyaan: git commit -stidak menandatangani komit. Sebaliknya, dari man git-commithalaman:

-s, --signoff
Tambahkan baris yang ditandatangani oleh committer di akhir pesan log komit.

Ini menghasilkan keluaran log yang mirip dengan yang berikut:


± $ 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 

Perhatikan bit "Ditandatangani oleh: ..."; yang dihasilkan oleh -sbendera di git-commit.

Mengutip email pengumuman rilis :

  • "git commit" learned "-S" to GPG-tandatangani komit; ini dapat ditunjukkan dengan opsi "--show-signature" untuk "git log".

Jadi ya, Anda dapat menandatangani komit. Namun, saya pribadi menyarankan agar berhati-hati dengan opsi ini; secara otomatis menandatangani komit di sebelah tidak ada gunanya, lihat di bawah:

Hanya pertanyaan sampingan, mungkin komit tidak boleh ditandatangani, hanya tag, yang tidak pernah saya buat, karena saya mengirimkan satu komit.

Itu benar. Komit tidak ditandatangani; tag adalah. Alasannya dapat ditemukan dalam pesan ini oleh Linus Torvalds , paragraf terakhir berbunyi:

Menandatangani setiap komit benar-benar bodoh. Itu hanya berarti bahwa Anda mengotomatiskannya, dan Anda membuat tanda tangannya kurang berharga. Ini juga tidak menambah nilai nyata, karena cara rantai-git DAG dari kerja SHA1, Anda hanya perlu satu tanda tangan untuk membuat semua komitmen dapat dicapai dari yang satu secara efektif tercakup oleh yang itu. Jadi menandatangani setiap komit tidak ada gunanya.

Saya akan mendorong penelusuran pesan yang ditautkan, yang menjelaskan mengapa penandatanganan dilakukan secara otomatis bukanlah ide yang jauh lebih baik daripada yang saya bisa.

Namun , jika Anda ingin menandatangani tag secara otomatis , Anda dapat melakukannya dengan membungkus git-tag -[s|u]alias; jika Anda akan melakukannya, Anda mungkin ingin mengatur id kunci Anda ~/.gitconfigatau .git/configfile spesifik proyek . Informasi lebih lanjut tentang proses itu dapat dilihat di buku komunitas git . Menandatangani tag jauh lebih berguna daripada menandatangani setiap komit yang Anda buat.

simont
sumber
74
"Menandatangani setiap komit sama sekali bodoh." -> Apa cara yang lebih baik untuk mengamankan komit ketika ada pengembang "tikus" yang suka mendorong komit dengan penulis dan komitter palsu? Kecuali ada beberapa hook hook di server dia bisa mengarahkan git blameke siapa pun yang dia inginkan.
Vi.
11
0. sebuah artikel , 1. "cukup untuk menandatangani semuanya" -> Bagaimana cara mengatakan "Saya mengklaim bahwa ini benar - benar perbedaan saya (tetapi tidak yakin tentang komitmen sebelumnya dan selanjutnya). Saya ingin memberi tanda tangan pada komit saya tanpa menyatakan apa-apa tentang komit yang saya tarik dari server pusat / apa pun 2. Dalam lingkungan yang tidak dipercaya masih harus ada alat yang dapat diandalkan untuk mencari tahu siapa yang bersalah. sulit untuk memalsukan komit (jika Anda mengamankan komputer Anda dengan baik)
Vi.
9
Menandatangani satu komit sudah cukup jika kode tidak pernah berubah. Setelah Anda menambahkan lebih banyak komit, Anda akan membutuhkan lebih banyak tanda tangan. Menandatangani tag menandai segala yang LEBIH TUA dari komit itu. Jika Anda memerlukan verifikasi berbutir halus saat komitmen datang, masuk akal untuk menandatangani setiap komitmen. Kalau tidak, Anda harus menggunakan banyak tag, yang hanya akan mengacaukan repo. Pada repositori remote git yang diautentikasi, Anda harus memberikan kata sandi atau kunci ssh Anda setiap kali Anda menekan komit, tidak hanya saat Anda mendorong tag. Ini adalah situasi yang serupa.
Hans-Christoph Steiner
22
Aku merasa Linus agak kehilangan intinya. Dia tampaknya memiliki kasus penggunaan yang sama sekali berbeda untuk komitmen yang ditandatangani dalam pikiran daripada OP di utas itu. (Memverifikasi integritas seluruh proyek, vs memverifikasi kepengarangan dari satu komitmen.)
Ajedi32
9
-1 untuk "Ya, tapi jangan lakukan itu." Jawabannya seharusnya berupa "YA". Komitmen penandatanganan membuktikan penulis, sesuatu yang bisa dibohongi dalam komit.
Urda
6

Untuk membuat penandatanganan kerja otomatis pre git versi 2.0, Anda harus menambahkan alias git untuk komit.

# git config --global alias.commit commit -S
[alias]
    commit = commit -S
Shubham Chaudhary
sumber
0

Anda perlu menjelaskan bahwa jika Anda menandatangani komit atau tag, itu tidak berarti Anda menyetujui seluruh riwayat. Dalam hal komit, Anda hanya menandatangani perubahan yang ada, dan dalam hal tag, baiklah .. Anda perlu mendefinisikan apa yang Anda maksud dengannya. Anda mungkin telah menarik perubahan yang mengklaimnya dari Anda tetapi tidak (karena orang lain mendorongnya ke remote Anda). Atau itu adalah perubahan yang tidak Anda inginkan, tetapi Anda baru saja menandatangani tag.

Dalam proyek OSS biasa ini mungkin kurang umum, tetapi dalam skenario perusahaan di mana Anda hanya menyentuh kode sesekali dan Anda tidak membaca seluruh sejarah itu mungkin tidak diperhatikan.

Penandatanganan komitmen adalah masalah jika mereka akan ditebus kembali atau dipilih untuk orang tua lainnya. Tetapi akan lebih baik jika komit yang dimodifikasi dapat menunjuk ke komit "asli" yang benar-benar diverifikasi.

eek
sumber
3
Rebasing seperti berbohong. Ini harus digunakan sangat hemat. Hal lain adalah bahwa melakukan dengan tanda tangan adalah kode "menandatangani", jadi pastikan bahwa itu adalah a) bukan anti-CYA dan b) tidak sia-sia.
11
@Barry “Rebasing itu seperti berbohong. Ini harus digunakan sangat hemat ”- ini tidak benar. Alur kerja berbasis rebase sama validnya dengan alur kerja berbasis gabungan. Rebasing terlalu kuat untuk digunakan dengan hemat.
Lukas Juhrich
1
Saat menggunakan ini secara eksklusif dengan GitHub yang tidak menjadi masalah, gabungan komit tidak akan ditandatangani oleh Anda, karena GitHub tidak mendukung ini. Keuntungan dari penandatanganan setiap (non-gabungan) komit dalam lingkungan ini, adalah membuatnya sangat jelas ketika komit nakal ditambahkan melalui PR karena tidak akan ditandatangani dengan kunci GPG Anda.
Arran Cudbard-Bell
3
"Berbahaya jika Anda menandatangani komit atau tag (keduanya akan menandatangani seluruh sejarah) bahwa Anda mungkin telah melakukan perubahan yang mengklaim itu dari Anda" Jika Anda hanya menandatangani komit meskipun saya tidak akan menafsirkannya sebagai pengesahan setiap komitmen yang bisa dicapai dari Anda. Anda tidak harus menyatakan bahwa perubahan masa lalu itu sah atau didukung oleh Anda, hanya bahwa Anda membuat komit berdasarkan dari perubahan itu. (Meskipun dengan tag, saya setuju Anda memang menandatangani semua komitmen yang dapat dicapai oleh tag.)
Ajedi32
1
@ ArranCudbard-Bell Sama seperti pembaruan, gabungan komit ditandatangani oleh Anda jika Anda menyetel commit.gpgsignke true seperti yang disarankan oleh @VonC
Jay