Git'te GPG anahtarıyla “otomatik atama” yapmanın bir yolu var mı?


213

Git'i oluşturulan her bir taahhüdü veya etiketi her zaman imzalatmanın kolay bir yolu var mı?

Gibi bir şey ile denedim:

takma ad taahhüt = taahhüt -S

Ama bu işe yaramadı.

Bunun gerçekleşmesi için farklı bir program yüklemek istemiyorum. Kolayca yapılabilir mi?

Sadece bir yan soru, belki taahhütler imzalanmamalı, sadece asla yaratmadığım etiketler, Homebrew gibi bir proje için tek taahhütler gönderirken.


8
Takma adınızın çalışmasının nedeni, zaten var olan bir komut üzerinde takma ad kullanamamanızdır. (ilgili: stackoverflow.com/questions/5875275/git-commit-v-by-default stackoverflow.com/questions/2500586/… stackoverflow.com/questions/1278296/… )
Dan D.

2
Sadece bilgi için: İmzalamak için tüm taahhütleri yeniden yazın: git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD@{u}..HEAD(Bunu kullanmanız gerektiği anlamına gelmez).
Vi.

Yanıtlar:


275

Not: -Staahhütlerinizin imzalandığından emin olmak için her zaman eklemek istemiyorsanız pu, Aralık 2013 için şimdilik bir teklif var (şube ' ', bu yüzden bir git sürümüne bunu yapacağının garantisi yok) Bu seçeneği sizin için halledecek yapılandırma.
Mayıs 2014 Güncellemesi: Git 2.0'da ( bu yama serisinde yeniden gönderildikten sonra )

Nicolas Vigier (boklm) tarafından taahhüt edilen 2af2ef3'e bakınız :

commit.gpgsignTüm taahhütleri imzalama seçeneğini ekleyin

Tüm taahhütlerinizi GPG olarak imzalamak istiyorsanız, -Sseçeneği her zaman eklemeniz gerekir . Yapılandırma seçeneği otomatik olarak tüm kaydedilmesini imzalamasını sağlar.
commit.gpgsign

commit.gpgsign

Tüm taahhütlerin GPG imzalı olup olmadığını belirtmek için bir mantıksal.
Rebase gibi işlemler yaparken bu seçeneğin kullanılması çok sayıda işlemin imzalanmasına neden olabilir. GPG parolanızı birkaç kez yazmaktan kaçınmak için bir aracı kullanmak uygun olabilir.


Bu yapılandırma genellikle repo başına ayarlanır (özel deneysel yerel depolarınızı imzalamanız gerekmez):

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

Bunu user.signingKeyglobal bir ayar olarak kullanılanla birleştirirsiniz (taahhüt işlemini imzalamak istediğiniz tüm repolar için kullanılan benzersiz anahtar)

git config --global user.signingkey F2C7AB29

user.signingKeyd67778e taahhüdü ile git 1.5.0'da (Ocak 2007) tanıtıldı :

Git depomda ve gpg anahtarımda aynı adı kullanmam gerekmiyor.
Ayrıca, anahtarlığımda birden fazla anahtar olabilir ve tamamlama iletilerinde kullandığım adresle eşleşmeyen bir anahtar kullanmak isteyebilirsiniz.

Bu düzeltme eki user.signingKey, " " varsa, gpg için "-u" anahtarına geçirilecek ve etiket imzalama anahtarının geçersiz kılınmasına olanak tanıyacak bir yapılandırma girişi ekler .

Bu birlikte uygulanır taahhüt aba9119 kullanıcı yanlış ayarlanmış ise davayı yakalamak için (git 1.5.3.2) user.signingKeykendi içinde .git/configkendi anahtarlık herhangi gizli tuşları yoksa sadece ya.

Notlar:


Bu gerçekten havalı. Github'da delik repoyu indirmeye gerek kalmadan git gibi bir şey yapmanın kolay bir yolu var mı?

13
Özel deneysel depolarınızı imzalamanıza gerek yok ... ama neden olmasın?
Andy Hayden

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

9E08524833CB3038FDE385C54C0AFCCFED5CDE14 anahtar kimliğinizle değiştirin. Unutmayın: Kısa kimliği kullanmak asla iyi bir fikir değildir .

GÜNCELLEME: Başına yeni git ferman , tüm yapılandırma anahtarları CamelCase olmalıdır.


Bunu VonC'nin cevabından kopyalayıp yapıştırdınız mı?
Robbie Averill

19
Hayır. Baskı tarihinde görebileceğiniz gibi, birileri benim cevabımda örneğimi ekledi. ED5CDE14 benim kişisel anahtarım. Ama sorun yok.
Felipe

7
Tuhaf. Senin için kötü göründüğü için yarın değişikliği geri alacağım
Robbie Averill

Anahtar imzalama kimliğinizi nasıl buldunuz? Ayrıca, tüm git depolarım için sadece 1 GPG anahtarı kötü mü? çünkü oldukça bağlantılı projelerde 4 fark tuşuyla uğraşmak istemem.
MarcusJ

1
Bu Linux kullanıcılarına yardımcı olabilir: Bazı durumlarda (örneğin Vim'de , PIN girişi gerektiren bir akıllı kartta saklanan bir anahtarı kullanarak) çalışması için düzenlemek ~/.gnupg/gpg-agent.confve eklemek zorunda kaldım pinentry-program /usr/bin/pinentry-gtk-2(bu kılavuzu wiki.archlinux.org/ index.php / GnuPG # pinentry )
iakovos Gurulian

49

Düzenleme: Git sürümü 1.7.9 itibariyle bu olduğunu mümkün Git kaydedilmesini imzalamak için ( git commit -S). Bunu yansıtmak için cevabı biraz güncellemek.

Soru başlığı:

Git'te GPG anahtarıyla “otomatik atama” yapmanın bir yolu var mı?

Kısa cevap: evet, ama yapma.

Sorudaki yazım hatasını adreslemek: git commit -staahhüdü imzalamaz. Aksine, man git-commitsayfadan:

-s, --signoff İşleme
günlüğü iletisinin sonundaki anahtar tarafından imzalanan satırı ekleyin.

Bu, aşağıdakine benzer bir günlük çıktısı verir:


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

"İmzalayan: ..." bitine dikkat edin; -süzerindeki bayrak tarafından üretildi git-commit.

Sürüm duyuru e-postasından alıntı :

  • GPG-imzasını imzalamak için "git commit" öğrendi "-S"; bu "git log" seçeneğine "--show-signature" seçeneği ile gösterilebilir.

Yani evet, taahhütleri imzalayabilirsiniz. Ancak, bu seçenekle bizzat dikkatli davranıyorum; otomatik imzalama taahhütlerinin yanında anlamsızdır, aşağıya bakın:

Sadece bir yan soru, belki de taahhütlerin imzalanmaması gerekir, sadece tek taahhütler gönderirken asla yaratmadığım etiketler.

Bu doğru. Taahhütler imzalanmamıştır; etiketler. Bunun nedeni , son paragrafında yazan Linus Torvalds tarafından bu mesajda bulunabilir :

Her bir taahhüdü imzalamak tamamen aptalca. Bu sadece otomatikleştirdiğiniz anlamına gelir ve imzayı daha az değerli hale getirirsiniz. Ayrıca herhangi bir gerçek değer katmaz, çünkü SHA1'in git DAG-zincirinin çalışması sırasında, tüm taahhütlerin bundan etkin bir şekilde kapsanabilmesi için sadece bir imzaya ihtiyacınız vardır . Yani her bir taahhüdü imzalamak basitçe eksik.

Bağlantılı iletiye göz atmayı teşvik ederim, bu da otomatik olarak imzalamanın neden işlediğimden çok daha iyi bir fikir olmadığını açıklar.

Ancak , otomatik olarak bir etiketi imzalamak istiyorsanız , bunu git-tag -[s|u]bir takma adla sararak yapabilirsiniz ; bunu yapacaksanız, muhtemelen anahtar kimliğinizi ~/.gitconfigveya projeye özgü .git/configdosyayı ayarlamak istersiniz . Bu süreç hakkında daha fazla bilgi git topluluk kitabında görülebilir . Etiketleri imzalamak, yaptığınız her taahhüdü imzalamaktan çok daha yararlıdır.


74
"Her bir taahhüdü imzalamak tamamen aptalca." -> Sahte yazar ve komisyoncu ile taahhütleri itmeyi seven bir "sıçan" geliştiricisi olduğunda taahhütleri güvence altına almanın daha iyi yolu nedir? Sunucuda kanca büyüsü olmadığı sürece git blameistediği kişiye yönlendirebilir.
Vi.

11
0. bir makale > Nasıl iddia" anlatmak için -, 1. "hepsini imzalamak için yeterlidir" bu gerçekten benim . Diff (ancak herhangi bir önceki ve daha fazla kaydedilmesini konusunda emin) Ben bir imza koymak istiyorum benim işlemek merkezi sunucudan / herhangi bir şeyden aldığım herhangi bir taahhütte bulunmadan, 2. Güvenilmeyen bir ortamda, kimin suçlu olduğunu bulmak için hala güvenilir bir araç olmalıdır. Bir taahhütte bulunmak zor (bilgisayarınızı iyi
koruyorsanız

9
Kod asla değişmezse bir taahhüt imzalamak yeterlidir. Daha fazla taahhüt ekledikten sonra daha fazla imzaya ihtiyacınız olacak. Bir etiketi imzalamak, bu işlemden daha eski olan her şeyi işaretliyor. Taahhütler gelirken ayrıntılı bir doğrulamaya ihtiyacınız varsa, her bir taahhüdü imzalamak mantıklıdır. Aksi takdirde, repoyu dağıtan çok sayıda etiket kullanmanız gerekir. Kimliği doğrulanmış uzak git depolarında, yalnızca etiketlere bastığınızda değil, her taahhütte bulunduğunuzda parolanızı veya ssh anahtarınızı vermeniz gerekir. Bu da benzer bir durum.
Hans-Christoph Steiner

22
Linus'un bu noktayı kaçırdığını hissediyorum. İmzalı taahhütler için, bu konudaki OP'den tamamen farklı bir kullanım durumu var gibi görünüyor. (Tüm projenin bütünlüğünü doğrulamak, tek bir taahhüdün yazarlığını doğrulamak.)
Ajedi32

9
-1 için "Evet, ama yapma." Cevap sadece düz "EVET" olmalıdır. İmzalama taahhütleri yazarın, aksi halde taahhütte yalan söylenebilecek bir şey olduğunu kanıtlar.
Urda

6

Otomatik imzalamanın çalışma öncesi sürüm 2.0'dan önce çalışması için, kesinleştirmek için git takma adı eklemeniz gerekir.

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

0

Bir taahhüdü veya etiketi imzalarsanız, tüm geçmişi onayladığınız anlamına gelmediğini açıkça belirtmeniz gerekir. Taahhüt durumunda, sadece eldeki değişikliği imzalarsınız ve etiket durumunda, bununla ne demek istediğinizi tanımlamanız gerekir. Sizden olduğunu iddia eden ama olmayan bir değişiklik yapmış olabilirsiniz (çünkü başka biri onu uzaktan kumandanıza itti). Ya da, içinde olmak istemediğiniz bir değişikliktir, ancak etiketi imzaladınız.

Tipik OSS projelerinde bu daha az yaygın olabilir, ancak sadece arada bir koda dokunduğunuz ve tüm geçmişi okumadığınız bir kurumsal senaryoda fark edilmeyebilir.

Taahhüt imzalamak, diğer ebeveynlere yeniden basacak veya kiraz alacaksa bir problemdir. Ancak, değiştirilmiş bir taahhüdün gerçekten doğrulayan "orijinal" taahhüdü göstermesi iyi olur.


3
İntikam etmek yalan söylemek gibidir. Aşırı derecede az kullanılmalıdır. Diğer bir şey, bir imzayla işlem yapmanın "imzalama" kodudur, bu yüzden a) CYA karşıtı değil ve b) boşa harcanmadığından emin olun.

11
@Barry “Yeniden yalan söylemek yalan söylemek gibidir. Aşırı derecede az kullanılmalıdır ”- bu doğru değil. Rebase tabanlı iş akışları, birleştirme tabanlı iş akışları kadar geçerlidir. İntikam almak az da olsa çok güçlü.
Lukas Juhrich

1
Bunu yalnızca GitHub ile kullanırken sorun değil, GitHub bunu desteklemediğinden birleştirme taahhütleri sizin tarafınızdan imzalanmayacaktır. Bu ortamda her birleştirme (birleştirmeden) taahhüdünü imzalamanın avantajı, bir PR aracılığıyla sahte bir işlemin ne zaman GPG anahtarınızla imzalanmayacağı eklendiğini çok açık hale getirmesidir.
Arran Cudbard-Bell

3
"Bir taahhüdü veya etiketi imzalarsanız (her ikisi de tüm geçmişi imzalar) sizden olduğunu iddia eden bir değişiklik yapmış olmanız tehlikelidir" Yalnızca bir taahhüdü imzalarsanız, bunu bir sizden ulaşılabilen her taahhüdün onaylanması. Bu geçmiş değişikliklerin sizin tarafınızdan geçerli olduğunu veya onaylandığını belirtmek zorunda değilsiniz, yalnızca bu değişikliklere dayalı bir taahhüt oluşturdunuz. (Bir etikete rağmen, gerçekten etiketin
erişebildiği

1
@ ArranCudbard-Bell commit.gpgsign@VonC
Jay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.