
पारदर्शी PGP-एन्क्रिप्टेड push/pull संचालन के लिए Git रिमोट हेल्पर, जो local, rsync, SFTP, और git बैकएंड का समर्थन करता है, कॉन्फ़िगरेबल प्रतिभागी कुंजियों के साथ।
:मैनुअल अनुभाग: 1
git-remote-gcrypt एक git रिमोट हेल्पर है जो GnuPG से एन्क्रिप्टेड रिपॉजिटरी से push और pull करने के लिए एक कस्टम फॉर्मेट का उपयोग करता है। यह रिमोट हेल्पर gcrypt:: उपसर्ग वाले URI को संभालता है।
समर्थित बैकएंड local, rsync:// और sftp:// हैं, जहाँ रिपॉजिटरी को फ़ाइलों के एक सेट के रूप में संग्रहीत किया जाता है, या इसके बजाय कोई भी <giturl> जहाँ gcrypt उसी प्रतिनिधित्व को एक git रिपॉजिटरी में संग्रहीत करेगा, जो मनमाने git परिवहन पर ब्रिज होता है। यदि आप उनमें से किसी एक का उपयोग कर सकते हैं तो local या rsync:// को प्राथमिकता दें; चर्चा के लिए नीचे "प्रदर्शन" देखें।
एक प्रयोगात्मक rclone:// बैकएंड भी है जो केवल प्रारंभिक उपयोगकर्ताओं के लिए है (आपको चेतावनी दी गई है)।
लक्ष्य विशिष्ट अविश्वसनीय फ़ाइल होस्ट या सेवाओं का उपयोग करके गोपनीय, प्रमाणित git भंडारण और सहयोग प्रदान करना है।
स्थापना ............
install.sh स्क्रिप्ट चलाएँत्वरित आरंभ ..........
push करके एक एन्क्रिप्टेड रिमोट बनाएँ::
git remote add cryptremote gcrypt::rsync://example.com/repo
git push cryptremote master
> gcrypt: Setting up new repository
> gcrypt: Remote ID is :id:7VigUnLVYVtZx8oir34R
> [ more lines .. ]
> To gcrypt::[...]
> * [new branch] master -> master
निम्नलिखित git-config(1) चर समर्थित हैं:
remote.<name>.gcrypt-participants
..
gcrypt.participants
GPG कुंजी पहचानकर्ताओं की स्पेस-सेपरेटेड सूची। रिमोट इन प्रतिभागियों के लिए एन्क्रिप्ट किया जाता है और केवल इन्हीं से हस्ताक्षर स्वीकार किए जाते हैं।
gpg -k आपके ज्ञात सभी सार्वजनिक कुंजियों को सूचीबद्ध करता है।
यदि यह विकल्प सेट नहीं है, तो हम आपकी डिफ़ॉल्ट कुंजी में एन्क्रिप्ट करते हैं और किसी भी मान्य हस्ताक्षर को स्वीकार करते हैं। इस व्यवहार को प्रतिभागियों को ``simple`` पर सेट करके स्पष्ट रूप से अनुरोध किया जा सकता है।
रिमोट पर ``gcrypt-participants`` सेटिंग रिपॉजिटरी चर ``gcrypt.participants`` पर पूर्वता लेती है।
remote.<name>.gcrypt-publish-participants
..
gcrypt.publish-participants
डिफ़ॉल्ट रूप से, प्रतिभागियों के gpg कुंजी आईडी को gpg -R का उपयोग करके एन्क्रिप्ट करके अस्पष्ट किया जाता है। इस विकल्प को true पर सेट करने से वह सुरक्षा उपाय अक्षम हो जाता है।
``gpg -R`` का उपयोग करने में समस्या यह है कि डिक्रिप्ट करने के लिए, gpg प्रत्येक उपलब्ध गुप्त कुंजी को तब तक आज़माता है जब तक कि उसे उपयोग योग्य कुंजी न मिल जाए।
इसके परिणामस्वरूप अनावश्यक पासफ़्रेज़ संकेत हो सकते हैं।
gcrypt.gpg-args
इस सेटिंग की सामग्री को gpg को तर्क के रूप में पारित किया जाता है।
जैसे --use-agent।
remote.<name>.gcrypt-signingkey
..
user.signingkey
(बाद वाला नियमित git कॉन्फ़िगरेशन से) हस्ताक्षर करने के लिए उपयोग की जाने वाली कुंजी।
यदि आपकी डिफ़ॉल्ट हस्ताक्षर कुंजी प्रतिभागी सूची का हिस्सा नहीं है, तो आपको user.signingkey सेट करना चाहिए। आप विभिन्न रिमोट पर विभिन्न कुंजियों का उपयोग करके हस्ताक्षर करने के लिए प्रति-रिमोट संस्करण का उपयोग कर सकते हैं।
remote.<name>.gcrypt-rsync-put-flags
..
gcrypt.rsync-put-flags
जब rsync:// बैकएंड का उपयोग करके रिमोट पर अपलोड किया जाता है तो rsync को पारित किए जाने वाले फ़्लैग। यदि फ़्लैग किसी विशिष्ट रिमोट पर सेट किए गए हैं, तो वैश्विक फ़्लैग, यदि सेट भी हैं, तो उस रिमोट के लिए लागू नहीं होंगे।
remote.<name>.gcrypt-require-explicit-force-push
..
gcrypt.require-explicit-force-push
एक लंबे समय से चला आ रहा बग यह है कि प्रत्येक git push में प्रभावी रूप से --force होता है।
यदि यह फ़्लैग ``true`` पर सेट है, तो git-remote-gcrypt push करने से इंकार कर देगा, जब तक कि ``--force`` पारित न किया जाए, या refspecs को ``+`` से उपसर्गित न किया जाए।
यहाँ एक संभावित समाधान है: https://bugs.debian.org/877464#32
GCRYPT_FULL_REPACK जब सेट किया जाता है (खाली स्ट्रिंग के अलावा कुछ भी), यह पर्यावरण चर push करते समय पूर्ण रीपैक को बाध्य करता है।
दो प्रतिभागियों के लिए रिमोट कैसे सेट करें::
git remote add cryptremote gcrypt::rsync://example.com/repo
git config remote.cryptremote.gcrypt-participants "KEY1 KEY2"
git push cryptremote master
git बैकएंड का उपयोग कैसे करें::
# ध्यान दें कि लक्ष्य git रिपॉजिटरी पहले से मौजूद होनी चाहिए और
# इसकी `next` शाखा को अधिलेखित कर दिया जाएगा!
git remote add gitcrypt gcrypt::[email protected]:repo#next
git push gitcrypt master
URL खंड (यहाँ #next) इंगित करता है कि किस बैकएंड शाखा का उपयोग किया गया है।
सहयोग प्रतिभागी कॉन्फ़िगरेशन से मेल खाने के लिए प्रत्येक push पर मैनिफ़ेस्ट के एन्क्रिप्शन को अपडेट किया जाता है। प्रत्येक push करने वाले उपयोगकर्ता के पास सभी सहयोगियों की सार्वजनिक कुंजियाँ और सही प्रतिभागी कॉन्फ़िगरेशन होना चाहिए।
निर्भरताएँ
क्रमशः rsync://, sftp:// और rclone:// रिमोट के लिए rsync, curl और rclone। मुख्य निष्पादन योग्य को एक POSIX-अनुपालन शेल की आवश्यकता है जो local का समर्थन करता हो।
GNU Privacy Guard
GPG 1.4 और 2 दोनों समर्थित हैं। आपको एक व्यक्तिगत GPG कुंजी की आवश्यकता है। GPG कॉन्फ़िगरेशन सार्वजनिक-कुंजी एन्क्रिप्शन, सममित एन्क्रिप्शन और हस्ताक्षर के लिए एल्गोरिदम विकल्पों पर लागू होता है। अधिक जानकारी के लिए man gpg देखें।
रिमोट आईडी रिमोट आईडी गुप्त नहीं है; यह केवल यह सुनिश्चित करता है कि एक ही उपयोगकर्ता द्वारा हस्ताक्षरित दो रिपॉजिटरी को प्रतिष्ठित किया जा सके। यदि रिमोट आईडी बदलती है, तो आपको एक चेतावनी दिखाई देगी, जो केवल तभी होनी चाहिए जब रिमोट को पुनः बनाया गया हो।
प्रदर्शन
किसी भी <giturl> या sftp:// URI का उपयोग करने के लिए प्रत्येक push के साथ पूरे रिपॉजिटरी इतिहास को अपलोड करने की आवश्यकता होती है। इसका मतलब है कि आपकी रिपॉजिटरी का push समय के साथ धीमा होता जाता है, जैसे-जैसे आपका git इतिहास लंबा होता है, और यह आसानी से उस बिंदु तक पहुँच सकता है जहाँ git-remote-gcrypt का निरंतर उपयोग अव्यावहारिक हो जाता है।
इस प्रकार, आपको इन बैकएंड का उपयोग केवल तभी करना चाहिए जब आप जानते हैं कि आपकी रिपॉजिटरी कभी भी बहुत बड़ी नहीं होगी, न कि केवल यह कि अभी बड़ी नहीं है। इसका मतलब है कि ये बैकएंड अधिकांश रिपॉजिटरी के लिए अनुपयुक्त हैं, और केवल असामान्य मामलों के लिए उपयुक्त होने की संभावना है, जैसे कि छोटे क्रेडेंशियल स्टोर। तब भी, यदि संभव हो तो `rsync://` का उपयोग करें। हालाँकि, ध्यान दें कि `rsync://` Gitolite, GitHub या GitLab जैसी रिपॉजिटरी होस्टिंग सेवा के साथ काम नहीं करेगा।
rsync URI
rsync बैकएंड के लिए URI फॉर्मेट rsync://user@host/path है, जो rsync स्थान user@host:/path में अनुवादित होता है, ssh के माध्यम से एक्सेस किया जाता है। ध्यान दें कि पथ निरपेक्ष है, होम निर्देशिका के सापेक्ष नहीं। एक पहले का गैर-मानक URI फॉर्मेट भी समर्थित है: rsync://user@host:path, जो rsync स्थान user@host:path में अनुवादित होता है।
rclone बैकएंड
rclone बैकएंड को gcrypt::rclone://remote:subdir जैसे URI वाले रिमोट के रूप में जोड़ने के अलावा, आपको rclone कॉन्फ़िगरेशन में भी रिमोट जोड़ना होगा। यह आमतौर पर rclone config निष्पादित करके किया जाता है। rclone(1) देखें।
rclone बैकएंड को प्रयोगात्मक माना जाता है और यह केवल प्रारंभिक उपयोगकर्ताओं के लिए है। आपको चेतावनी दी गई है।
रिपॉजिटरी फॉर्मेट .................
| EncSign(X): GPG कुंजी धारक को साइन और एन्क्रिप्ट करें
| Encrypt(K,X): सममित-कुंजी एल्गोरिदम का उपयोग करके एन्क्रिप्ट करें
| Hash(X): SHA-2/256
|
| B: शाखा सूची
| L: प्रत्येक पैकफ़ाइल के लिए हैश (Hi) और कुंजी (Ki) की सूची
| R: रिमोट आईडी
|
| रिपॉजिटरी लिखने के लिए:
|
| प्रत्येक पैकफ़ाइल P को Encrypt(Ki, P) → P' के रूप में फ़ाइलनाम Hi में संग्रहीत करें
| जहाँ Ki एक नया यादृच्छिक स्ट्रिंग है और Hash(P') → Hi
| मैनिफ़ेस्ट में संग्रहीत करें
|
| रिपॉजिटरी पढ़ने के लिए:
|
| मैनिफ़ेस्ट प्राप्त करें, GPG कुंजी रिंग का उपयोग करके डिक्रिप्ट और सत्यापित करें →
| यदि पहले देखी गई रिमोट आईडी से मेल नहीं खाता तो चेतावनी दें
| में प्रत्येक के लिए:
| सर्वर से फ़ाइल प्राप्त करें →
| सत्यापित करें कि से मेल खाता है
| का उपयोग करके को डिक्रिप्ट करें → फिर को git के साथ खोलें
मैनिफ़ेस्ट फ़ाइल .............
उदाहरण मैनिफ़ेस्ट फ़ाइल (संक्षिप्तता के लिए दीर्घवृत्त के साथ)::
$ gpg -d 91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a
542051c7cd152644e4995bda63cc3ddffd635958 refs/heads/next
3c9e76484c7596eff70b21cbe58408b2774bedad refs/heads/master
pack :SHA256:f2ad50316...cd4ba67092dc4 z8YoAnFpMlW...3PkI2mND49P1qm
pack :SHA256:a6e17bb4c...426492f379584 82+k2cbiUn7...dgXfyX6wXGpvVa
keep :SHA256:f2ad50316...cd4ba67092dc4 1
repo :id:OYiSleGirtLubEVqJpFF
प्रत्येक आइटम नई पंक्ति तक फैला होता है, और निम्नलिखित में से एक से मेल खाता है:
<sha-1> <gitref>
Git ऑब्जेक्ट आईडी और उसका रेफ़
pack :<hashtype>:<hash> <key>
पैकफ़ाइल हैश (Hi) और संबंधित सममित कुंजी (Ki)।
keep :<hashtype>:<hash> <generation>
पैकफ़ाइल हैश और उसकी रीपैक पीढ़ी
repo <id>
रिमोट आईडी
extn <name> ...
एक्सटेंशन फ़ील्ड, संरक्षित लेकिन अप्रयुक्त।
यह पता लगाने के लिए कि कोई git url gcrypt रिपॉजिटरी है या नहीं, उपयोग करें: git-remote-gcrypt --check url
यदि रिपॉजिटरी मौजूद है और डिक्रिप्ट की जा सकती है तो निकास स्थिति 0 है, यदि रिपॉजिटरी gcrypt का उपयोग करती है लेकिन डिक्रिप्ट नहीं की जा सकती तो 1, और यदि रिपॉजिटरी gcrypt के साथ एन्क्रिप्ट नहीं है (या एक्सेस नहीं की जा सकती) तो 100 है।
ध्यान दें कि इसके लिए gcrypt रिपॉजिटरी का उपयोग करते समय की तरह ही, रिपॉजिटरी सामग्री को स्थानीय git रिपॉजिटरी में लाना पड़ता है।
प्रत्येक git push में प्रभावी रूप से --force होता है। push करने से पहले pull करना सुनिश्चित करें।
git-remote-gcrypt बिना चेतावनी के रिमोट को रीपैक करने का निर्णय ले सकता है, जिसका अर्थ है कि आपका push अचानक आपकी अपेक्षा से काफी अधिक समय ले सकता है, क्योंकि आपके पूरे इतिहास को फिर से अपलोड करना होता है। यह push खराब लिंक पर विफल हो सकता है।
git-remote-gcrypt एक रिपॉजिटरी को "नहीं मिला" के रूप में रिपोर्ट कर सकता है जब रिपॉजिटरी वास्तव में मौजूद हो, लेकिन git-remote-gcrypt को प्रमाणीकरण, पोर्ट या नेटवर्क कनेक्टिविटी समस्याएँ हो रही हों।
git-remote-helpers(1), gpg(1)
git-remote-gcrypt के मूल लेखक GitHub उपयोगकर्ता bluss थे।
2013 और 2014 में वास्तविक अनुरक्षक Joey Hess थे।
वर्तमान अनुरक्षक, 2016 से, Sean Whitton [email protected] है।
यह दस्तावेज़ और git-remote-gcrypt समान शर्तों, GPL-3 (या 2+) के तहत लाइसेंस प्राप्त हैं; git-remote-gcrypt फ़ाइल देखें।
.. this document generates a man page with rst2man .. vim: ft=rst tw=72 sts=4
EncSign(B || L || R)(B, L, R)RLHi, KiHiP'Hash(P')HiKiP'PP