क्या GPG कुंजी के साथ Git में "ऑटोसाइन" करने का कोई तरीका है?


213

क्या Git बनाने का एक आसान तरीका है कि हमेशा प्रत्येक कमिट या टैग को बनाया जाए?

मैंने इसे कुछ इस तरह आज़माया:

alias प्रतिबद्ध = प्रतिबद्ध -S

लेकिन वह चाल नहीं चली।

मैं ऐसा करने के लिए एक अलग कार्यक्रम स्थापित नहीं करना चाहता। क्या यह आसानी से संभव है?

बस एक साइड सवाल, शायद कमिट्स पर हस्ताक्षर नहीं होने चाहिए, केवल टैग, जो मैं कभी नहीं बनाता हूं, जैसे कि मैं एक प्रोजेक्ट के लिए एक ही सबमिट करता हूं जैसे होमब्रे, आदि।


8
आपके उपनाम ने काम करने का कारण यह बताया कि आप पहले से मौजूद कमांड पर उपनाम नहीं बना सकते। (संबंधित: stackoverflow.com/questions/5875275/git-commit-v-by-default stackoverflow.com/questions/2500586/… stackoverflow.com/questions/1278296/… )
Dan D.

2
बस जानकारी के लिए: सभी को साइन इन करने के लिए धकेलने के लिए पुन: प्रयास करें: git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD@{u}..HEAD(मेरा मतलब यह नहीं है कि आपको इसका उपयोग करना चाहिए)।
वि।

जवाबों:


275

ध्यान दें: यदि आप यह सुनिश्चित नहीं करना चाहते -Sहैं कि आपके कमिट पर हस्ताक्षर किए जाने के लिए हर समय जोड़ना है pu, तो अभी के लिए दिसंबर 2013 में एक प्रस्ताव (शाखा ' ) है, इसलिए कोई गारंटी नहीं है कि वह इसे जारी करने के लिए बनाएगा) config जो आपके लिए उस विकल्प का ध्यान रखेगा।
मई 2014 को अपडेट करें: यह Git 2.0 में है ( इस पैच श्रृंखला में पुनः भेजने के बाद )

निकोलस विगियर (boklm) द्वारा प्रतिबद्ध 2af2ef3 देखें :

commit.gpgsignसभी कमिट पर हस्ताक्षर करने का विकल्प जोड़ें

अगर आप अपने सभी कमिट्स पर GPG साइन करना चाहते हैं, तो आपको -Sहर समय विकल्प जोड़ना होगा । Config विकल्प स्वचालित रूप से सभी प्रतिबद्ध हस्ताक्षर करने के लिए अनुमति देता है।
commit.gpgsign

commit.gpgsign

यह निर्दिष्ट करने के लिए एक बूलियन कि क्या सभी कमिट GPG पर हस्ताक्षर किए जाने चाहिए।
इस तरह के विकल्प का उपयोग जब रीबेज़ जैसे ऑपरेशन करते हैं, तो बड़ी संख्या में कमिट पर हस्ताक्षर किए जा सकते हैं। कई बार अपने GPG पासफ़्रेज़ को टाइप करने से बचने के लिए एजेंट का उपयोग करना सुविधाजनक हो सकता है।


यह कॉन्फ़िगरेशन आमतौर पर रेपो के अनुसार सेट किया जाता है (आपको अपने निजी प्रायोगिक स्थानीय प्रतिनिधि पर हस्ताक्षर करने की आवश्यकता नहीं है):

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

आप इसे user.signingKeyएक वैश्विक सेटिंग के रूप में उपयोग करेंगे (जहां आप साइन इन करना चाहते हैं, सभी रेपो के लिए उपयोग की जाने वाली अद्वितीय कुंजी)

git config --global user.signingkey F2C7AB29

user.signingKeygit 1.5.0 (जनवरी 2007) में प्रतिबद्ध d67778e के साथ पेश किया गया था :

ऐसी आवश्यकता नहीं होनी चाहिए कि मैं अपने git रिपॉजिटरी और gpg कुंजी में अपने नाम के समान रूप का उपयोग करूं।
इसके अलावा, मेरी कीरिंग में कई कुंजियाँ हो सकती हैं, और मैं एक ऐसा उपयोग करना चाहता हूं जो मेरे द्वारा प्रतिबद्ध संदेशों में उपयोग किए गए पते से मेल न खाए।

यह पैच एक कॉन्फ़िगरेशन प्रविष्टि जोड़ता है " user.signingKey", जो यदि मौजूद है, तो इसे gpg के लिए "-u" स्विच में पास किया जाएगा, जिससे टैग हस्ताक्षर कुंजी को ओवरराइड किया जा सकेगा।

यह उस मामले को पकड़ने के लिए प्रतिबद्ध aba9119 (git 1.5.3.2) के साथ लागू किया जाता है , जहां यदि उपयोगकर्ता ने user.signingKeyअपने में गलत जानकारी दी है .git/configया उनके कीरिंग पर कोई गुप्त कुंजी नहीं है।

टिप्पणियाँ:


यह वास्तव में अच्छा है। वहाँ एक आसान तरीका है github पर कुछ करना है जैसे git का वर्णन छेद रेपो को डाउनलोड किए बिना?

13
आपको अपने निजी प्रयोगात्मक प्रतिनिधि पर हस्ताक्षर करने की आवश्यकता नहीं है ... लेकिन आप क्यों नहीं करेंगे?
एंडी हेडन

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

9E08524833CB3038FDE385C54C0AFCCFED5CDE14 को अपनी मुख्य आईडी से बदलें। याद रखें: शॉर्ट आईडी का उपयोग करना कभी भी अच्छा विचार नहीं है

अद्यतन: प्रति एक नया Git फतवे , सभी कॉन्फ़िगरेशन कुंजियां CamelCase में होना चाहिए।


क्या आपने VonC के उत्तर से इसे कॉपी और पेस्ट किया है ?
रॉबी एवरिल

19
जैसा कि आप संस्करण इतिहास में देख सकते हैं कि किसी ने अपने उत्तर में मेरा उदाहरण जोड़ा है। ED5CDE14 मेरी निजी कुंजी है। लेकिन कोई समस्या नहीं।
फेलिप

7
विचित्र। मैं कल परिवर्तन को वापस कर दूंगा क्योंकि यह आपके लिए बुरा लग रहा है
रॉबी एवरिल

आपको अपनी मुख्य हस्ताक्षर आईडी कैसे मिल सकती है? भी, मेरे सभी git प्रतिनिधि के लिए सिर्फ 1 GPG कुंजी खराब है? क्योंकि मैं बहुत से जुड़े परियोजनाओं में 4 अलग कुंजी से निपटने के लिए नहीं करना चाहते हैं।
मार्कस जे

1
यह लिनक्स उपयोगकर्ताओं की मदद कर सकता है: इसे कुछ अवसरों में काम करने के लिए (उदाहरण के लिए विम पर, स्मार्ट कार्ड में संग्रहीत कुंजी का उपयोग करके पिन प्रविष्टि की आवश्यकता होती है) मुझे इसे संपादित करना ~/.gnupg/gpg-agent.confऔर जोड़ना था pinentry-program /usr/bin/pinentry-gtk-2(इस गाइड wiki.archlinux.org/ पर जाकर) index.php / GnuPG # पिनेंट्री )
iakovos Gurulian

49

संपादित करें: Git संस्करण 1.7.9 के रूप में, यह है संभव Git प्रतिबद्ध हस्ताक्षर करने के लिए ( git commit -S)। इसे प्रतिबिंबित करने के लिए उत्तर को थोड़ा अद्यतन करें।

प्रश्न शीर्षक है:

क्या GPG कुंजी के साथ Git में "ऑटोसाइन" करने का कोई तरीका है?

संक्षिप्त उत्तर: हाँ, लेकिन ऐसा न करें।

प्रश्न में टाइपो को संबोधित करना: git commit -sप्रतिबद्ध पर हस्ताक्षर नहीं करता है। बल्कि, man git-commitपेज से:

-s, --signoff
प्रतिबद्ध लॉग संदेश के अंत में कमेंट द्वारा साइन-ऑफ-बाय लाइन जोड़ें।

यह निम्न के समान एक लॉग आउटपुट देता है:


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

"साइन-ऑफ-बाय: ..." पर ध्यान दें; उस -sध्वज द्वारा उत्पन्न किया गया था git-commit

रिलीज की घोषणा ईमेल का हवाला देते हुए :

  • "git कमिट" सीखा "-S" GPG- हस्ताक्षर करने के लिए कमिट; इसे "- लॉग-लॉग" विकल्प के साथ "गिट लॉग" दिखाया जा सकता है।

तो हाँ, आप प्रवेश कर सकते हैं। हालांकि, मैं व्यक्तिगत रूप से इस विकल्प के साथ सावधानी बरतने का आग्रह करता हूं; स्वचालित रूप से हस्ताक्षर करना व्यर्थ के बगल में है, नीचे देखें:

सिर्फ एक साइड सवाल, शायद कमिट्स पर हस्ताक्षर नहीं होने चाहिए, केवल टैग, जो मैं कभी नहीं बनाता, जैसा कि मैं सिंगल कमिट सबमिट करता हूं।

यह सही है। कमिट पर हस्ताक्षर नहीं किए गए हैं; टैग हैं। इसका कारण लिनुस टॉर्वाल्ड्स के इस संदेश में पाया जा सकता है , जिसका अंतिम पैराग्राफ कहता है:

प्रत्येक वचन पर हस्ताक्षर करना पूरी तरह से मूर्खता है। इसका सिर्फ इतना मतलब है कि आप इसे स्वचालित करते हैं, और आप हस्ताक्षर कम मूल्य पर बनाते हैं। यह किसी भी वास्तविक मूल्य को नहीं जोड़ता है, क्योंकि SHA1 के कार्य के git DAG- श्रृंखला के बाद से, आपको केवल एक ही हस्ताक्षर की आवश्यकता होती है ताकि सभी कमिट एक से प्रभावी हो सकें जो कि प्रभावी रूप से उस एक द्वारा कवर किया जाए। इसलिए प्रत्येक कमिट पर हस्ताक्षर करने से बिंदु गायब है।

मैं लिंक किए गए संदेश को ब्राउज़ करने के लिए प्रोत्साहित करता हूं, जो स्पष्ट करता है कि साइन इन करना स्वचालित रूप से एक बेहतर विचार नहीं है जितना मैं कर सकता था।

हालाँकि , यदि आप स्वचालित रूप से एक टैग पर हस्ताक्षर करना चाहते हैं, तो आप इसे git-tag -[s|u]एक उपनाम में लपेटकर ऐसा करने में सक्षम होंगे ; यदि आप ऐसा करने जा रहे हैं, तो आप संभवतः अपनी कुंजी आईडी ~/.gitconfigया प्रोजेक्ट-विशिष्ट .git/configफ़ाइल को सेटअप करना चाहते हैं । उस प्रक्रिया के बारे में अधिक जानकारी गिट समुदाय की किताब में देखी जा सकती है । टैग्स पर हस्ताक्षर करना आपके द्वारा किए गए प्रत्येक वचन पर हस्ताक्षर करने से अधिक उपयोगी है।


74
"प्रत्येक प्रतिबद्ध पर हस्ताक्षर करना पूरी तरह से मूर्खता है।" -> सुरक्षित करने का बेहतर तरीका क्या है जब एक "चूहा" डेवलपर होता है, जो नकली लेखक और कमिटेटर के साथ धक्का देना पसंद करता है? जब तक सर्वर पर कुछ हुक जादू नहीं है, वह git blameजो चाहे उसे निर्देशित कर सकता है।
वि।

11
0. एक लेख > "कैसे पता करें कि मैं दावा है कि -, 1." उन सभी को हस्ताक्षर करने के लिए पर्याप्त है " यह वास्तव में है मेरी । Diff (लेकिन किसी भी पिछले और आगे प्रतिबद्ध के बारे में अनिश्चित) मैं पर हस्ताक्षर रखना चाहता हूँ मेरी प्रतिबद्ध केंद्रीय सर्वर / जो कुछ भी मैंने खींचा है, उसके बारे में कुछ भी पूछे बिना। अविश्वासित वातावरण में अभी भी एक विश्वसनीय उपकरण होना चाहिए, जो यह पता लगा सके कि कौन दोषी है। यदि सर्वर यह जांचता है कि सभी कमिट्स कमिटर्स के ईमेल की कुंजी के साथ हस्ताक्षरित हैं, तो यह है। कमिट टू नकली कमिट (यदि आप अपने कंप्यूटर को अच्छी तरह से सुरक्षित करते हैं)।
vi।

9
यदि कोड कभी नहीं बदलता है, तो एक प्रतिबद्धता पर हस्ताक्षर करना पर्याप्त है। एक बार जब आप अधिक आवागमन जोड़ लेते हैं, तो आपको अधिक हस्ताक्षरों की आवश्यकता होगी। एक टैग पर हस्ताक्षर करना उस प्रतिबद्धता की तुलना में हर चीज को चिह्नित कर रहा है। यदि आपको ठीक अनाज सत्यापन की आवश्यकता है क्योंकि कमिट आ रहे हैं, तो यह प्रत्येक कमिट पर हस्ताक्षर करने के लिए समझ में आता है। अन्यथा आपको बहुत सारे टैग्स का उपयोग करना होगा, जो सिर्फ रेपो को अव्यवस्थित करेगा। प्रमाणित रिमोट गिट रिपॉज पर, आपको हर बार जब आप टैग पुश करते हैं, तब न केवल आपको एक पुश करने पर अपना पासवर्ड या ssh कुंजी देना होता है। यह एक ऐसी ही स्थिति है।
हंस-क्रिस्टोफ़ स्टीनर

22
मुझे ऐसा लगता है कि लिनुस बिंदु को याद करने की तरह है। ऐसा लगता है कि उस धागे में ओपी की तुलना में हस्ताक्षरित कमिट के लिए एक पूरी तरह से अलग उपयोग मामला है। (संपूर्ण परियोजना की अखंडता को सत्यापित करना, बनाम एक ही प्रतिबद्धता के लेखकत्व की पुष्टि करना।)
Ajedi32

9
-1 के लिए "हां, लेकिन ऐसा न करें।" जवाब सिर्फ एक फ्लैट "यस" होना चाहिए। हस्ताक्षर करने से लेखक को कुछ साबित होता है, जो अन्यथा के बारे में प्रतिबद्ध हो सकता है।
उर्दा

6

ऑटो साइनिंग वर्क प्री git वर्जन 2.0 बनाने के लिए, आपको कमिट के लिए git उर्फ ​​जोड़ना होगा।

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

0

आपको यह स्पष्ट करने की आवश्यकता है कि यदि आप एक प्रतिबद्ध या टैग पर हस्ताक्षर करते हैं, तो इसका मतलब यह नहीं है कि आप पूरे इतिहास को स्वीकार करते हैं। कमिट करने के मामले में आप केवल हाथ में परिवर्तन पर हस्ताक्षर करते हैं, और टैग के मामले में, ठीक है .. आपको यह परिभाषित करने की आवश्यकता है कि आपके साथ इसका क्या मतलब है। आपने एक परिवर्तन खींच लिया होगा जो यह दावा करता है कि यह आप से है लेकिन ऐसा नहीं था (क्योंकि किसी और ने इसे आपके रिमोट पर धकेल दिया था)। या यह एक ऐसा बदलाव है जो आप नहीं करना चाहते हैं, लेकिन आपने केवल टैग पर हस्ताक्षर किए हैं।

विशिष्ट ओएसएस परियोजनाओं में यह कम आम हो सकता है, लेकिन एक उद्यम परिदृश्य में जहां आप केवल हर बार कोड को छूते हैं और आप पूरे इतिहास को नहीं पढ़ते हैं, यह किसी का ध्यान नहीं जा सकता है।

कमिट्स पर हस्ताक्षर करना एक समस्या है अगर वे अन्य माता-पिता को छूट या चेरी-चुने जाएंगे। लेकिन यह अच्छा होगा यदि एक संशोधित प्रतिबद्ध "मूल" प्रतिबद्ध को इंगित कर सकता है जो वास्तव में पुष्टि करता है।


3
रिबासिंग झूठ बोलने जैसा है। इसे बहुत अधिक संयम से इस्तेमाल किया जाना चाहिए। दूसरी बात यह है कि एक हस्ताक्षर के साथ कमिट करना "कोड ऑफ करना" है, इसलिए यह सुनिश्चित करें कि यह क) एंटी-सीवाईए नहीं है और बी) व्यर्थ प्रयास नहीं है।

11
@ बैरी “रीबासिंग झूठ बोलने जैसा है। इसे बहुत अधिक प्रयोग किया जाना चाहिए "- यह सिर्फ सच नहीं है। Rebase- आधारित वर्कफ़्लो केवल मर्ज-आधारित वर्कफ़्लो के रूप में मान्य हैं। रिबासिंग वैसे भी बहुत शक्तिशाली है जिसका प्रयोग संयम से किया जाता है।
लुकास जुहरीच

1
GitHub के साथ विशेष रूप से इसका उपयोग करते समय यह कोई समस्या नहीं है, मर्ज किए गए कमिट्स पर आपके द्वारा हस्ताक्षर नहीं किए जाएंगे, क्योंकि GitHub इसका समर्थन नहीं करता है। इस वातावरण में प्रत्येक (गैर-मर्ज) हस्ताक्षर करने का लाभ यह है कि क्या यह बहुत स्पष्ट हो जाता है जब एक पीआर के माध्यम से एक दुष्ट प्रतिबद्ध जोड़ा गया क्योंकि यह आपकी जीपीजी कुंजी के साथ हस्ताक्षरित नहीं होगा।
अरन कडबार्ड-बेल

3
"यदि आप एक प्रतिबद्ध या टैग (दोनों पूरे इतिहास पर हस्ताक्षर करेंगे) यह खतरनाक है कि आपने एक परिवर्तन खींच लिया है जो यह दावा करता है कि यह आप से है" यदि आप केवल एक प्रतिबद्धता पर हस्ताक्षर कर रहे हैं, तो मैं व्याख्या नहीं करूंगा कि एक के रूप में आपकी ओर से उपलब्ध हर प्रतिबद्ध का समर्थन। आप जरूरी नहीं कह रहे हैं कि उन पिछले परिवर्तनों को मान्य या आपके द्वारा समर्थन किया गया है, केवल आपने उन परिवर्तनों के आधार पर एक प्रतिबद्ध बनाया है। (हालांकि एक टैग के साथ, मैं मानता हूं कि आप वास्तव में टैग द्वारा उपलब्ध सभी
कमेंट्स

1
@ ArranCudbard-Bell सिर्फ एक अपडेट के रूप में, मर्ज कमिट आपके द्वारा हस्ताक्षरित हैं यदि आप commit.gpgsign@VonC द्वारा सुझाए गए अनुसार सही हैं
Jay
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.