٥، ٧، المساهمة في مشروع
 — مشروع عمومي عبر البريد الشابكي

للكثير من المشروعات أسلوب متفق عليه لقبول الرُّقَع؛ عليك النظر في قواعد كل مشروع، لأن كل مشروع مختلف. ولأن العديد من المشروعات الكبيرة، ذات التاريخ، تقبل الرقع عبر قائمة المطوِّرين البريدية، فسنرى مثالًا على ذلك الآن.

هذا الأسلوب شبيه بالسابق: تُنشئ فرع موضوع لكل سلسلة من الرقع تعمل عليها؛ إنما الفرق هو كيف ترسلها إلى المشروع: لا تشتق المستودع وتدفع إلى اشتقاقك، لكن تحوّل كل إيداع إلى رسالة بريدية وترسلها إلى قائمة المطورين البريدية:

$ git checkout -b topicA
  ... عمل ...
$ git commit
  ... عمل ...
$ git commit

لديك الآن إيداعان تود إرسالهما إلى القائمة البريدية، فتستعمل أمر تنسيق الرقع git format-patch لإنشاء ملفات بصيغة mbox حتى ترسلها بالبريد الشابكي إلى القائمة. يحوّل هذا الأم‍ر كل إيداع إلى رسالة بريد عنوانها السطر الأول من رسالة الإيداع، وباقي رسالة الإيداع في متن الرسالة مع رقعة الإيداع (التعديلات التي قدّمها هذا الإيداع، بصيغة مخصوصة). الجميل في هذا أن تطبيق رقعة من رسالة أنشأها أمر تنسيق الرقع، يحافظ على معلومات الإيداع.

$ git format-patch -M origin/master
0001-add-limit-to-log-function.patch
0002-increase-log-output-to-30-from-25.patch

أمر تنسيق الرقع يطبع أسماء الملفات التي أنشأها، والخيار -M (اختصار --find-renames) يأمر جت أن يكتشف الملفات التي تغيّرت أسماؤها أو مساراتها. وتبدو الملفات في حالتنا هكذا:

$ cat 0001-add-limit-to-log-function.patch
From 330090432754092d704da8e76ca5c05c198e71a8 Mon Sep 17 00:00:00 2001
From: Sameera Samara <sameera@example.com>
Date: Sun, 6 Apr 2008 10:17:23 -0700
Subject: [PATCH 1/2] Add limit to log function

Limit log functionality to the first 20

---
 lib/simplegit.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index 76f47bc..f9815f1 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -14,7 +14,7 @@ class SimpleGit
   end

   def log(treeish = 'master')
-    command("git log #{treeish}")
+    command("git log -n 20 #{treeish}")
   end

   def ls_tree(treeish = 'master')
--
2.1.0

ويمكن في ملفات الرقع هذه زيادة معلومات تريد أن تخبر بها القائمة البريدية ولا تظهر في رسالة الإيداع؛ فإذا أضفت نصًّا بين السطر --- وأول الرقعة (السطر diff --git)، فسيستطيع المطورون قراءته، لكن برنامج الترقيع سيتجاهله.

لإرسال هذا إلى القائمة البريدية، يمكنك أن تلصق محتوى الملف في برنامج بريدك الشابكي، أو أن ترسله عبر برنامج سطر الأوامر. لكن لصقه قد يضيّع شيئًا من تنسيقه، خصوصا مع برامج عملاء البريد «الذكية» التي لا تحافظ على فواصل السطور والمسافات البيضاء الأخرى كما ينبغي. لكننا نحمد الله أن جت يتيح لنا أداةً تساعدنا في إرسال رقع منسقة كما ينبغي عبر ميفاق IMAP، الذي قد يكون أسهل لك. فسنشرح الآن كيف نرسل رقعة عبر Gmail، فهو وكيل البريد الشابكي الذي نعرف التعامل معه حق المعرفة؛ يمكنك الاطلاع على شرح مفصّل لعدد من برامج البريد في آخر الملف السابق ذكره (Documentation/SubmittingPatches) في مستودع مصدر جت.

عليك أولًا إعداد قسم imap في ملف التهيئة الخاص بك ~/.gitconfig. يمكنك تنفيذ سلسلة من أوامر التهيئة git config لتعيين كل قيمة على حدة، أو إضافتهن جميعًا يدويًّا. في النهاية سيكون ملف التهيئة مثل هذا:

[imap]
  folder = "[Gmail]/Drafts"
  host = imaps://imap.gmail.com
  user = user@gmail.com
  pass = YX]8g76G_2^sFbd
  port = 993
  sslverify = false

إن لم يكن خادوم IMAP يستعمل SSL، فغالبًا لن تحتاج السطرين الأخيرين، وستبدأ خانة host بـ imap:// وليس imaps://. بعد إعداد هذا، يمكنك تنفيذ أمر رفع المسوّدة git imap-send حتى تضع سلسلة الرقع في مجلد المسوّدات (Drafts) في خادوم IMAP الذي حددته:

$ cat *.patch | git imap-send
Resolving imap.gmail.com... ok
Connecting to [74.125.142.109]:993... ok
Logging in...
sending 2 messages
100% (2/2) done

عندئذٍ تجدها في مجلد المسودات؛ عدّل خانة «إلى» (To) لتجعل فيها عنوان القائمة البريدية التي تريد إرسال الرقعة إليها، وربما تضيف في خانة «نسخة للعلم» (CC) عنوانَ القائم على المشروع أو المسؤول عن هذا الجزء، ثم ترسلها.

ويمكنك كذلك إرسال هذه الرقع عبر خادوم SMTP. يمكنك مثلما سبق تنفيذ سلسلة من أوامر التهيئة git config لتعيين كل قيمة على حدة، أو إضافتهن جميعًا يدويًّا في قسم sendemail في ملف تهيئتك ~/.gitconfig:

[sendemail]
  smtpencryption = tls
  smtpserver = smtp.gmail.com
  smtpuser = user@gmail.com
  smtpserverport = 587

بعدئذٍ نفّذ أمر الإرسال git send-email لإرسال رُقَعك:

$ git send-email *.patch
0001-add-limit-to-log-function.patch
0002-increase-log-output-to-30-from-25.patch
Who should the emails appear to be from? [Sameera Samara <sameera@example.com>]
Emails will be sent from: Sameera Samara <sameera@example.com>
Who should the emails be sent to? sameera@example.com
Message-ID to be used as In-Reply-To for the first email? y

عندئذٍ يطبع لك جت كتلة معلومات تقريرية لكل رقعة ترسها، مثل هذه:

(mbox) Adding cc: Sameera Samara <sameera@example.com> from
  \line 'From: Sameera Samara <sameera@example.com>'
OK. Log says:
Sendmail: /usr/sbin/sendmail -i sameera@example.com
From: Sameera Samara <sameera@example.com>
To: sameera@example.com
Subject: [PATCH 1/2] Add limit to log function
Date: Sat, 30 May 2009 13:29:15 -0700
Message-Id: <1243715356-61726-1-git-send-email-sameera@example.com>
X-Mailer: git-send-email 1.6.2.rc1.20.g8c5b.dirty
In-Reply-To: <y>
References: <y>

Result: OK

انظر موقع git-send-email.io للمساعدة في تهيئة نظامك وبريدك، ولنصائح وحيل أخرى، ولبيئة تجارب معزولة لتجربة إرسال رقعة بالبريد الشابكي.