٢، ٦، الوسوم
مثل معظم أنظمة إدارة النسخ، يستطيع جت وسم المراحل المهمة في تاريخ المشروع.
يستعمل الناس هذه الآلية في الغالب لتمييز الإصدارات (v1.0 و v2.0 وهكذا).
سنتعلم في هذا الفصل كيف نسرد الوسوم الموجودة وكيف ننشئ وسومًا ونحذفها وما النوعان المختلفان للوسوم.
سرد وسوم مشروعك
سرد الوسوم الموجودة في مستودع جت سهل ومباشر؛
فقط اكتب git tag (اختياريًا مع -l أو --list):
$ git tag
v1.0
v2.0
يسرد لك هذا الأمر الوسوم بترتيب أبجدي؛ أي أن ترتيب عرضها ليس له أهمية حقيقية.
يمكنك أيضا البحث عن الوسوم التي تطابق نمطًا معينًا. يحتوي مستودع مصدر جت مثلا على أكثر من خمسمئة وسم. فإذا كنت مهتمًا برؤية سلسلة 1.8.5 فقط، فنفذ هذا:
$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
|
سرد الوسوم بأنماط يحتاج الخيار
-l أو --listإذا لم تُرِد إلا قائمة الوسوم بكاملها، فتنفيذ لكن إذا أعطيته نمطًا لمطابقة وسوم عديدة، فتحتاج خيار السرد: |
إنشاء وسوم
يتيح جت نوعين من الوسوم: خفيفة، ومعنونة.
الوسم الخفيف كأنه فرع لا يتغيّر: مجرد إشارة إلى إيداع معين.
لكن على النقيض، الوسوم المعنونة هي كائنات كاملة في قاعدة بيانات جت؛ يحسب جت بصمتها، ويسجل معها اسم الواسم، وبريده، وتاريخ الوسم، ورسالته، ويمكن توقيعها وتوثيقها باستعمال GNU Privacy Guard (GPG). من الأفضل في العموم إنشاء وسوم معنونة حتى تنتفع بكل هذه المعلومات، لكن إذا أردت وسمًا مؤقتًا أو لسببٍ ما لم تشأ الاحتفاظ بكل هذه المعلومات، فالوسوم الخفيفة متاحة.
الوسوم المعنونة
إنشاء الوسوم المعنونة في جت سهل.
الطريقة الأيسر هي إضافة -a (اختصار --annotate «عنونة») إلى أمر الوسم:
$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4
والخيار -m (اختصار --message=) يعيّن رسالة الوسم التي تخزّن معه.
وإذا لم تعيّنها لوسم معنون، فسيفتح لك جت محررك حتى تكتبها فيه.
يمكنك أيضا رؤية تاريخ الوسم مع الإيداع الموسوم بأمر الإظهار git show:
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
يُظهر لك هذا معلومات الواسم وتاريخ وسم الإيداع ورسالة الوسم، ثم معلومات الإيداع نفسه.
الوسوم الخفيفة
طريقة أخرى لوسم الإيداعات هي بالوسوم الخفيفة.
هذا لا يعني إلا تخزين بصمة الإيداع في ملف؛ فلا معلومات أخرى تُخزّن.
لإنشاء وسم خفيف، لا تعطِ أمر الوسم أيًّا من الخيارات -a أو -s أو -m (اختصارات --annotate و --sign و --message= على الترتيب)؛ أعطه فقط اسم الوسم:
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
تنفيذ git show على مثل هذا الوسم لن يعطيك معلومات الوسم الإضافية،
بل يُظهر فقط معلومات الإيداع:
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
الوسم فيما بعد
يمكنك أيضا وسم إيداعات قديمة تخطيتها. لنفترض مثلا أن تاريخ إيداعاتك يبدو هكذا:
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
4682c3261057305bdd616e23b64b0857d832627b Add todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme
لنفترض الآن أنك نسيت وسم المشروع عند v1.2، التي كانت عند إيداع “Update rakefile”.
يمكنك فعل هذا بعدما حدث ما حدث.
لوسم ذلك الإيداع، اكتب في نهاية أمر الوسم بصمةَ الإيداع (أو جزءًا من أولها):
$ git tag -a v1.2 9fceb02
والآن ستجد أنك قد وسمت الإيداع:
$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5
$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date: Mon Feb 9 15:32:16 2009 -0800
version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date: Sun Apr 27 20:43:35 2008 -0700
Update rakefile
...
مشاركة الوسوم
أمر الدفع لا ينقل آليًّا الوسومَ إلى المستودعات البعيدة.
فعليك دفعها بأمر صريح بعد إنشائها.
هذه العملية كبيرة الشبه بمشاركة الفروع البعيدة: نفّذ git push origin «اسم-الوسم».
$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
وإذا كانت لديك العديد من الوسوم التي تريد دفعها جملةً واحدة، فيمكنك إضافة خيار الوسوم --tags إلى أمر الدفع git push،
لينقل إلى المستودع البعيد جميع وسومك التي ليست هناك بالفعل.
$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.4 -> v1.4
* [new tag] v1.4-lw -> v1.4-lw
والآن، عندما يستنسخ أحدهم مستودعك أو يجذب منه، فسيحصل على جميع وسومك أيضا.
|
يدفع أمر الدفع كلا النوعين من الوسوم
سيدفع |
حذف الوسوم
لحذف وسم من مستودعك المحلي، نفذ git tag -d «اسم-الوسم».
مثلا، يمكننا حذف الوسم الخفيف الذي أنشأناه سابقًا هكذا:
$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)
لاحظ أن هذا لا يحذف الوسم من أي مستودع بعيد. توجد طريقتان شائعتان لحذف وسمٍ ما من مستودع بعيد:
الطريقة الأولى هي git push «البعيد» :refs/tags/«اسم-الوسم»:
$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
- [deleted] v1.4-lw
لاستيعاب ما تفعله هذه الطريقة يمكن ترى أنها تدفع القيمة الفارغة التي قبل النقطتين الرأسيتين إلى اسم الوسم على المستودع البعيد، فعمليًّا تحذفه.
الطريقة الأخرى (والبديهية أكثر) لحذف وسم من مستودع بعيد، هي:
$ git push origin --delete «اسم-الوسم»
سحب الوسوم
إذا أردت رؤية نُسخ الملفات التي يشير إليها وسمٌ ما، يمكنك سحب هذا الوسم بأمر git checkout، مع أن هذا يضع مستودعك في حالة “detached HEAD”، التي لها بعض الآثار الجانبية السيئة:
$ git checkout v2.0.0
Note: switching to 'v2.0.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final
$ git checkout v2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... Add atlas.json and cover image
في حالة “detached HEAD”، إذا عدّلت شيئًا وأودعت، فإن الوسم سيبقى كما هو، وإيداعك الجديد لن ينتمي إلى أي فرع ولن يمكن الوصول إليه أبدا، إلا ببصمته. لذا، فإن احتجت إجراء تعديلات — مثلا لإصلاح علة في نسخة قديمة — فغالبا ستحتاج إلى إنشاء فرع:
$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'
إذا فعلت هذا ثم أودعت، فإن فرع version2 سيكون مختلفًا عن وسم v2.0.0 لأنه سيكون متقدمًا عنه بتعديلاتك، لذا كن حذرًا.