برچسب زدن (Tagging)
در این مقاله در مورد مفهوم برچسب گذاری در Git و دستور git tag صحبت خواهیم کرد. برچسب ها منبع هایی هستند که به نقاط خاصی از تاریخ Git اشاره می کنند. به طور کلی از برچسب گذاری برای مشخص کردن نقطه ای در تاریخ Git برای انتشار نسخه ی خاصی (برای مثال v1.0.1) استفاده می شود. برچسب مانند شاخه ایست که تغییر نمی کند. برخلاف شاخه ها، برچسب ها پس از ایجاد، دیگر تاریخچه ی commit ها را ندارند. در این مقاله انواع مختلف برچسب ها، شیوه ی ایجاد برچسب ها، لیست کردن همه ی برچسب ها، حذف برچسب ها، اشتراک گذاری برچسب ها و.. را بررسی خواهیم کرد.
ایجاد یک برچسب
با اجرای دستور زیر یک برچسب جدید را می توان ایجاد کرد:
git tag x
در زمان ایجاد برچسب، می توانx را با یک شناسه ی معنایی جایگزین کرد. یک الگوی معمول استفاده از شماره نسخه ها مانند git tag v1.4 است. Git از دو نوع برچسب annotated
و lightweight
پشتیبانی می کند. مثال بالا یک برچسب lightweight
را ایجاد می کند. برچسب های annotated
و lightweight
از نظر meta data هایی که ذخیره می کنند با هم تفاوت دارند. بهترین روش استفاده از برچسب های Git در نظر گرفتن برچسب های annotated به عنوان عمومی و برچسب های lightweight
به عنوان خصوصی است. برچسب های annotated، meta data های اضافی مانند: نام برچسب زننده، ایمیل و تاریخ زدن برچسب را ذخیره می کند. این داده ها برای انتشار عمومی مهم است. برچسب های lightweight
در اصل نشان گذاری های یک commit هستند، آنها فقط یک نام و یک اشاره گر برای یک commit هستند که برای ایجاد پیوندهای سریع به commit مربوط به آن مفید هستند.
برچسب های Annotated
این برچسب ها یک شیء کامل را در پایگاه داده ی Git ذخیره می کنند. مانند commit و پیام commit این برچسب ها نیز پیام برچسب زدن (tagging) دارند. افزون بر این، برای امنیت، این برچسب ها را می توان با GNU Privacy Guard (GPG ابزاری برای رمز گذاری) امضا و تأیید کرد.
git tag -a v1.4
با اجرای این دستور یک برچسب annotated
جدید ایجاد می شود که با v1.4
مشخص شده است. سپس این دستور، یک ویرایش گر متن پیش فرض پیکربندی شده ای را باز می کند.
git tag -a v1.4 -m "my version 1.4"
اجرای این دستور مانند دستور قبلی است، با این حال این نسخه از دستور، گزینه ی -m
و یک پیام را منتقل می کند. این یک روش راحت مانند git commit -m
است که بلافاصله یک برچسب جدید ایجاد می کند و به دلیل ذخیره ی پیام ارسال شده با گزینه ی -m
، از باز کردن ویرایش گر متن محلی چشم پوشی می کند.
برچسب های Lightweight
git tag v1.4-lw
اجرای این دستور یک برچسب lightweight
ایجاد می کند که با عنوان v1.4-lw
شناخته می شود. برچسب های lightweight
بدون گزینه های -a
، -s و -m
ایجاد می شوند. برچسب های lightweight
یک سربرگ برچسب جدید ایجاد می کنند و آن را در پوشه ی ./git
مخزن پروژه ذخیره می کنند.
لیست کردن برچسب ها
برای لیست کردن برچسب های ذخیره شده در مخزن دستور زیر را اجرا می کنیم:
git tag
با اجرای این دستور لیستی از برچسب ها مانند لیست زیر نمایش داده می شود:
v0.10.0 v0.10.0-rc1 v0.11.0 v0.11.0-rc1 v0.11.1 v0.11.2 v0.12.0 v0.12.0-rc1 v0.12.1 v0.12.2 v0.13.0 v0.13.0-rc1 v0.13.0-rc2
برای اصلاح لیست برچسب ها، گزینه ی -l به همراه یک عبارت wild card (یک الگوی خاص) را به دستور git tag مانند مثال زیر اضافه می کنیم:
$ git tag -l *-rc*v0.10.0-rc1 v0.11.0-rc1 v0.12.0-rc1 v0.13.0-rc1 v0.13.0-rc2 v0.14.0-rc1 v0.9.0-rc1 v15.0.0-rc.1 v15.0.0-rc.2 v15.4.0-rc.3
مثال بالا از گزینه ی -l
و عبارت wild card، *-rc*
استفاده می کند تا لیستی از تمام برچسب هایی که در آنها -rc
وجود دارد را بر گرداند. عبارت -rc
به طور معمول برای شناسایی کاندیدهای انتشار استفاده می شود.
برچسب گذاری commit های قدیمی
در مثال های برچسب گذاری قبلی که بررسی شدند دستور git tag به روشنی بهcommit خاصی اشاره نمی کرد. به طور پیش فرض، git tag برای commit ای که HEAD ارجاع می دهد، برچسب ایجاد می کند. از سوی دیگر git tag می تواند برای یک commit خاصی که ارجاع داده می شود برچسبی ایجاد کند. در این صورت به جای پیش فرض HEAD، commit داده شده را برچسب گذاری می کند. برای جمع آوری لیستی از commit های قدیمی دستور git log را اجرا می کنیم.
$ git log --pretty=oneline
با اجرای دستور git log لیستی از commit ها مانند لیست زیر حاصل می شود:
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'feature' a6b4c97498bd301d84096da251c98a07c7723e65 add update method for thing 0d52aaab4479697da7686c15f77a3d64d9165190 one more thing 6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
در این مثال بالاترین commit یعنی '
Merge branch
'feature
را برای برچسب جدید انتخاب می کنیم. برای این کار نیاز هست که hash SHA مربوط به commit مورد نظر را به دستور git tag بدهیم:
git tag -a v1.2 15027957951b64cf874c3557a0f3547bd83b3ff6
اجرای دستور بالا برچسب annotated
جدیدی را که با عنوان v1.2 مشخص شده، برای commit انتخاب شده در مثال git log بالا ایجاد می کند.
برچسب گذاری مجدد/جایگزینی برچسب های قدیمی
اگر درخواستی برای ایجاد یک برچسب که شناسه ای مشابه با یکی از برچسب های موجود دارد، داده شود Git خطایی مانند مثال زیر نمایش می دهد:
fatal: tag 'v0.4' already exists
افزون بر مورد بالا اگر یک commit قدیمی با شناسه ی برچسبی موجود، برچسب گذاری شود، Git باز هم خطای بالا را نمایش می دهد.
درصورت نیاز به به روز رسانی برچسبی که موجود است، باید از گزینه ی -f (FORCE)
استفاده شود.
git tag -a -f v1.4 15027957951b64cf874c3557a0f3547bd83b3ff6
با اجرای دستور بالا، commit با hash SHA 15027957951
b64cf874c3557a0f3547bd83b3ff6
به شناسه ی برچسب v1.4
وصل می شود. این کار محتوای موجود را برای برچسب v1.4
با محتوای جدید جایگزین می کند.
اشتراک گذاری:push کردن برچسب ها به یک remote
به اشتراک گذاشتن برچسب ها مانند push کردن شاخه ها است. به طور پیش فرض، git push برچسب ها را push نمی کند. برای این کار باید به طور شفاف به git push گفته شود که چه برچسبی را push کند.
$ git push origin v1.4
برای push کردن چندین برچسب به طور همزمان باید گزینه ی --tags
را به دستور git push اضافه کرد. حال اگر کاربر دیگری مخزن را کپی یا pull کند، برچسب های جدید را دریافت می کند.
Checkout کردن به یک برچسب
با استفاده از دستور git checkout می توان وضعیت یک مخزن را در یک برچسب مشاهده کرد.
git checkout v1.4
دستور بالا به برچسب v1.4، checkout
می کند. این کار مخزن را در حالت HEAD جدا قرار می دهد. این یعنی هرگونه تغییری که ایجاد شود، باعث به روز رسانی برچسب نمی شود. این تغییرات یک commit جداگانه ی جدیدی را ایجاد می کنند. این commit جدا شده ی جدید، بخشی از هیچ شاخه ای نخواهد بود و فقط به طور مستقیم توسط hash SHA مربوط به commit قابل دسترسی است. بنابراین بهترین کار برای هنگامی که می خواهیم تغییراتی را در حالت HEAD جداگانه ایجاد کنیم این است که این کار را در یک شاخه جدید انجام دهیم.
پاک کردن برچسب ها
پاک کردن برچسب ها عملی ساده است. با اضافه کردن -d و شناسه ی برچسب به دستور git tag، برچسب شناسایی شده حذف می شود.
$ git tag => v1 v2 v3
$ git tag -d v1
$ git tag => v2 v3
در این مثال ابتدا دستور git tag اجرا می شود تا لیستی از برچسب ها را نشان دهد که برچسب هایv1 ، v2 ، v3
را نمایش می دهد. سپس دستور git tag -d v1 اجرا می شود که برچسب v1 را پاک می کند. دوباره دستور git tag اجرا می شود و لیستی از برچسب ها را نشان دهد که برچسب های v1، v2
را نشان می دهد.
نتیجه
از برچسب گذاری به طور معمول برای ایجاد برچسب هایی که شناسه ی آنها با استفاده از semantic versioning
ساخته می شود، متناسب با چرخه های انتشار نرم افزار استفاده می شود. دستور git tag بخش اصلی برای کار با برچسب هاست مانند: ایجاد، اصلاح و حذف برچسب ها که از این دستور بهره می برند. در این مقاله دریافتیم که برچسب ها به دو نوع annotated
و lightweight
تقسیم بندی می شوند. استفاده از برچسب های annotated
به طور کلی بهتر است زیرا meta data های ارزشمند بیشتری را در مورد برچسب ها نسبت به برچسب های lightweight
ذخیره می کنند. دستورهای git push
و git checkout
که در این مقاله استفاده شد را در قسمت های بعدی این دوره توضیح خواهیم داد.