
أداة مساعدة عن بعد لـ Git للعمليات الدفع/السحب المشفرة بشفافية باستخدام PGP، تدعم الخلفيات المحلية وrsync وSFTP وgit مع مفاتيح مشاركين قابلة للتكوين.
:قسم الدليل: 1
git-remote-gcrypt هي أداة مساعدة للـ remote في git تسمح بالدفع والسحب من مستودعات مشفرة باستخدام GnuPG، وذلك باستخدام تنسيق مخصص. تتعامل هذه الأداة مع URIs التي تبدأ بـ gcrypt::.
الـ backends المدعومة هي local و rsync:// و sftp://، حيث يتم تخزين المستودع كمجموعة من الملفات، أو بدلاً من ذلك أي <giturl> حيث يخزن gcrypt نفس التمثيل في مستودع git، عبر أي نقل git. يُفضل استخدام local أو rsync:// إذا كان يمكنك استخدام أحدهما؛ انظر "الأداء" أدناه للمناقشة.
يوجد أيضًا backend تجريبي rclone:// مخصص للمتبنين الأوائل فقط (قد حذرت).
الهدف هو توفير تخزين git سري وموثوق والتعاون باستخدام مضيفات أو خدمات ملفات نموذجية غير موثوقة.
التثبيت ............
استخدم مدير الحزم لتوزيعة GNU/Linux الخاصة بك — دبيان، أوبونتو، فيدورا، آرتش وبعض التوزيعات الصغيرة معروف عنها وجود حزم.
قم بتشغيل السكريبت المرفق install.sh على الأنظمة الأخرى.
البداية السريعة ..........
أنشئ remote مشفرًا عن طريق الدفع إليه::
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. يتم تشفير الـ remote لهؤلاء المشاركين ويتم قبول التواقيع منهم فقط.
gpg -k يسرد جميع المفاتيح العامة التي تعرفها.
إذا لم يتم تعيين هذا الخيار، نقوم بالتشفير إلى مفتاحك الافتراضي ونقبل أي توقيع صحيح. يمكن طلب هذا السلوك صراحةً عن طريق تعيين المشاركين إلى `simple`.
إعداد `gcrypt-participants` على الـ remote له الأولوية على متغير المستودع `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 لتوقيع remotes مختلفة باستخدام مفاتيح مختلفة.
remote.<name>.gcrypt-rsync-put-flags
..
gcrypt.rsync-put-flags
Flags يتم تمريرها إلى rsync عند الرفع إلى remote باستخدام backend rsync://. إذا تم تعيين الـ flags إلى remote معين، فلن يتم تطبيق الـ flags العامة، إذا تم تعيينها أيضًا، لذلك الـ remote.
remote.<name>.gcrypt-require-explicit-force-push
..
gcrypt.require-explicit-force-push
هناك خطأ قديم يتمثل في أن كل git push له بشكل فعال --force.
إذا تم تعيين هذه العلامة إلى `true`، سيرفض git-remote-gcrypt الدفع، ما لم يتم تمرير `--force`، أو كانت refspecs مسبوقة بـ `+`.
يوجد حل محتمل هنا: https://bugs.debian.org/877464#32
GCRYPT_FULL_REPACK عند ضبطه (على أي شيء غير السلسلة الفارغة)، يفرض متغير البيئة هذا إعادة حزمة كاملة عند الدفع.
كيفية إعداد remote لمشاركين اثنين::
git remote add cryptremote gcrypt::rsync://example.com/repo
git config remote.cryptremote.gcrypt-participants "KEY1 KEY2"
git push cryptremote master
كيفية استخدام backend git::
# لاحظ أن مستودع git الهدف يجب أن يكون موجودًا بالفعل وسيتم الكتابة فوق فرعه `next`!
git remote add gitcrypt gcrypt::[email protected]:repo#next
git push gitcrypt master
يشير جزء URL (#next هنا) إلى فرع backend المستخدم.
التعاون يتم تحديث تشفير البيان (manifest) لكل عملية دفع لتتوافق مع تكوين المشاركين. يجب أن يكون لكل مستخدم يقوم بالدفع المفاتيح العامة لجميع المتعاونين وتكوين المشاركين الصحيح.
التبعيات
rsync و curl و rclone لـ remotes rsync: و sftp: و rclone: على التوالي. يتطلب التنفيذ الرئيسي شيلًا متوافقًا مع POSIX يدعم local.
GNU Privacy Guard
كلا من GPG 1.4 و 2 مدعومان. تحتاج إلى مفتاح GPG شخصي. ينطبق تكوين GPG على اختيارات الخوارزمية للتشفير بالمفتاح العام والتشفير المتناظر والتوقيع. انظر man gpg لمزيد من المعلومات.
معرف الـ Remote معرف الـ Remote ليس سريًا؛ فهو يضمن فقط إمكانية التمييز بين مستودعين موقعة من قبل نفس المستخدم. ستظهر تحذير إذا تغير معرف الـ Remote، والذي يجب أن يحدث فقط إذا تم إعادة إنشاء الـ remote.
الأداء
استخدام أي <giturl> أو URI sftp:// يتطلب رفع تاريخ المستودع بالكامل مع كل عملية دفع. هذا يعني أن عمليات الدفع لمستودعك تصبح أبطأ بمرور الوقت، مع زيادة تاريخ git الخاص بك، ويمكن أن يصل بسهولة إلى النقطة التي يصبح فيها الاستخدام المستمر لـ git-remote-gcrypt غير عملي.
لذلك، يجب استخدام هذه الـ backends فقط عندما تعلم أن مستودعك لن يصبح كبيرًا جدًا في أي وقت، وليس فقط أنه ليس كبيرًا الآن. هذا يعني أن هذه الـ backends غير مناسبة لمعظم المستودعات، ومن المحتمل أن تكون مناسبة فقط للحالات غير العادية، مثل مخازن بيانات الاعتماد الصغيرة. وحتى في هذه الحالة، استخدم `rsync://` إذا استطعت. لاحظ، مع ذلك، أن `rsync://` لن تعمل مع خدمة استضافة مستودعات مثل Gitolite أو GitHub أو GitLab.
URIs rsync
تنسيق URI لـ backend rsync هو rsync://user@host/path، والذي يترجم إلى موقع rsync user@host:/path، ويتم الوصول إليه عبر ssh. لاحظ أن المسار مطلق، وليس نسبيًا لدليل المنزل. كما يتم دعم تنسيق URI غير قياسي سابق: rsync://user@host:path، والذي يترجم إلى موقع rsync user@host:path
Backend rclone
بالإضافة إلى إضافة backend rclone كـ remote باستخدام URI مثل gcrypt::rclone://remote:subdir، يجب عليك أيضًا إضافة الـ remote إلى تكوين rclone. يتم ذلك عادةً عن طريق تنفيذ rclone config. انظر rclone(1).
يعتبر backend rclone تجريبيًا ومخصصًا للمتبنين الأوائل فقط. قد حذرت.
تنسيق المستودع .................
| EncSign(X): التوقيع والتشفير إلى مالك مفتاح GPG
| Encrypt(K,X): التشفير باستخدام خوارزمية مفتاح متناظر
| Hash(X): SHA-2/256
|
| B: قائمة الفروع
| L: قائمة الهاش (Hi) والمفتاح (Ki) لكل ملف حزمة
| R: معرف الـ Remote
|
| لكتابة المستودع:
|
| قم بتخزين كل ملف حزمة P كـ Encrypt(Ki, P) → P' في اسم الملف Hi
| حيث Ki سلسلة عشوائية جديدة و Hash(P') → Hi
| قم بتخزين في البيان
|
| لقراءة المستودع:
|
| احصل على البيان، قم بفك التشفير والتحقق باستخدام حلقة مفاتيح GPG →
| قم بالتحذير إذا كان لا يطابق معرف الـ Remote الذي شوهد سابقًا
| لكل في :
| احصل على الملف من الخادم →
| تحقق من أن يطابق
| قم بفك تشفير باستخدام → ثم افتح مع 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>
معرف الـ remote
extn <name> ...
حقل امتداد، يتم الاحتفاظ به ولكن لا يتم استخدامه.
لكشف ما إذا كان رابط git هو مستودع gcrypt، استخدم: git-remote-gcrypt --check url
حالة الخروج هي 0 إذا كان المستودع موجودًا ويمكن فك تشفيره، و1 إذا كان المستودع يستخدم gcrypt ولكن لا يمكن فك تشفيره، و100 إذا كان المستودع غير مشفر باستخدام gcrypt (أو لا يمكن الوصول إليه).
لاحظ أن هذا يتطلب جلب محتويات المستودع إلى مستودع git المحلي، تمامًا كما يحدث عند استخدام مستودع gcrypt.
كل git push له بشكل فعال --force. تأكد من سحب التغييرات قبل الدفع.
يمكن لـ git-remote-gcrypt أن يقرر إعادة حزمة الـ remote دون تحذير، مما يعني أن عملية الدفع قد تستغرق فجأة وقتًا أطول بكثير مما كنت تتوقع، حيث يجب إعادة رفع تاريخك بالكامل. قد تفشل هذه الدفعة عبر اتصال ضعيف.
قد يبلغ 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.
.. هذا المستند ينشئ صفحة رجل باستخدام rst2man .. vim: ft=rst tw=72 sts=4
EncSign(B || L || R)(B, L, R)RHi, KiLHiP'Hash(P')HiP'KiPP