چگونه یک مخزن Git را کپی کنیم؟ راهنمای گام به گام

Summarize this content to 400 words in Persian Lang
یاد بگیرید که چگونه یک مخزن git را در چند مرحله ساده آینه کنید
زمینه
قبل از اینکه نحوه کپی کردن یک مخزن git را توضیح دهم، اجازه دهید زمینه را برای شما توضیح دهم. در Droids On Roids، ما ترجیح می دهیم از ابزارهای خودمان برای CI/CD، میزبانی VCS و سایر فرآیندها استفاده کنیم. همه توسعه دهندگان ما آنها را به خوبی می شناسند، که در مقایسه با استفاده از ابزارهای مشتریان جداگانه برای هر پروژه، سرعت توسعه را افزایش می دهد.
معمولاً مهم نیست که از چه چیزی در داخل استفاده می کنیم. با این حال، در مورد مخزن، مشتریان ممکن است بخواهند کد را در سرورهای تحت کنترل خود ذخیره کنند. این کاملاً قابل درک است، زیرا آنها معمولاً مالکیت معنوی را نیز خریداری می کنند، بنابراین آنها مالک کل کد هستند.
گاهی اوقات آن میزبانی در سمت مشتری ممکن است کامل نباشد.
به عنوان مثال، ممکن است از یک ارائه دهنده متفاوت استفاده کند. GitLab به جای GitHub که ما روزانه از آن استفاده می کنیم. یا حتی ممکن است یک سرور Git خود میزبان بدون هیچ گونه رابط وب باشد که تنها با استفاده از یک کلید قابل دسترسی است.
چگونه میتوانیم یک فرآیند بازبینی کد یا راهاندازی وب هوکها برای CI را روی چیزی شبیه به آن انجام دهیم؟ بیایید ببینیم چه کاری می توانیم انجام دهیم!
موارد
اولاً، لزوم ذخیره کد در یک مکان خاص به این معنی نیست که آن تنها مکان است.
ما هنوز هم میتوانیم از GitHub مورد علاقه خود برای توسعه روزانه استفاده کنیم و فقط کدها را در مخزن مشتری کپی کنیم.
برای انجام کارآمد آن، اجازه دهید ابتدا به چند سوال پاسخ دهیم.
آیا باید همه چیز را آینه کنیم، یا فقط شاخه ها و/یا برچسب های خاص؟
محرک عمل آینه چیست؟
معمولاً مشتری فقط به برخی از نقاط عطف/انتشارها علاقه دارد و نه همه کارهای میانی. در چنین حالتی، ما معمولاً می خواهیم فقط شاخه اصلی و شاید برخی از برچسب ها را آینه کنیم.
توجه داشته باشید که ما در اینجا هیچ مشکل قانونی را در نظر نمی گیریم. بررسی کنید که آیا محدودیتی در مورد مکان ذخیره سازی در قرارداد وجود ندارد. گاهی اوقات ممکن است فشار دادن کد به ابرهای عمومی ممنوع باشد.
دامنه
انعکاس همه چیز ممکن است، اما به خاطر داشته باشید که پیکربندی میزبانی هدف باید با منبع سازگار باشد.
به عنوان مثال، شاخه های حاوی فشارهای فشاری روی منبع نباید روی هدف محافظت شوند. فشار دادن برخی از سازه هایی که در سمت هدف استفاده نمی شوند نیز ممکن است باعث ایجاد خطا یا اخطار شوند. Gerrit ارجاعاتی ایجاد می کند (که لزوماً به شاخه ها یا برچسب ها اشاره نمی کنند) که ممکن است برای افرادی مانند GitHub قابل درک نباشد.
ماشه تفنگ
آینهسازی اغلب زمانی که به نقطه عطفی دست مییابد، مانند در پایان تکرار/دوی سرعت یا فقط به طور منظم، بهعنوان مثال، آغاز میشود. هفتگی یا روزانه من توصیه میکنم این عملیات را روی یک ساخت CI جداگانه انجام دهید، نه چیزی که حتی میتوانید به مناسبت آن را داشته باشید.
به عنوان مثال، حتی اگر یک ساخت «sprint» دارید که محصول را منتشر میکند، نباید آینهکاری را به عنوان یکی از مراحل/مراحل آن اضافه کنید. چرا؟
خب، شما هیچ کنترلی روی مخزن هدف ندارید. اگر یک مخزن غیرقابل دسترسی شود، شخصی کلید را باطل کند یا همان برچسبی را که میخواهید فشار دهید فشار دهد، در این صورت انعکاس شما با شکست مواجه میشود، حتی اگر مصنوع با موفقیت منتشر شده باشد.
علاوه بر این، کپی محلی که برای ساخت محصول استفاده میشود، ممکن است شعبهای را که میخواهید منعکس کنید، پرداخت نکند، اما در عوض یک commit خاص را بهعنوان یک HEAD جدا شده بررسی میکند.
به عنوان مثال، در Bitrise CI یک ماشه مرتبط با یک عمل فشار (به شاخه) commit تحت فشار را بررسی می کند. در نقطه تریگر در بالای شاخه قرار داشت اما در زمان ساخت (کلونینگ)، ممکن است کامیت های جدیدی بعد از آن ظاهر شود، زیرا ممکن است در این بین فشارهایی وجود داشته باشد.
کد
بیایید شروع به کدنویسی کنیم! Mirroring خود از 2 عملیات تشکیل شده است:
شبیه سازی (یا تهیه یک نسخه از قبل شبیه سازی شده).
هل دادن.
برای مثال، دسترسی به مخازن با فعال کردن کلیدهای SSH خارج از محدوده است، اما در صورت نیاز، باید قبل از دسترسی به مخزن خاص انجام شود.
در مورد ساخت تازه (توصیه شده)، شبیه سازی برای یک شاخه به این صورت است:
git clone –bare –single-branch –no-tags –branch= .
یا مانند این برای کل مخزن:
git clone –mirror .
جایی که نام شاخه ای است که می خواهید شبیه سازی کنید، و URL منبع (نه هدف!) مخزن است. به نقطه انتهایی توجه کنید! به معنی دایرکتوری فعلی است.
از خالی بودن آن مطمئن شوید. برخی از پلتفرمهای CI ممکن است برخی فایلهای موقت را در آنجا ایجاد کنند یا دایرکتوری اولیه را روی چیزی که معمولاً خالی نیست، مانند $HOME تنظیم کنند. در چنین مواردی از قبل این دستور را اجرا کنید: pushd $(mktemp -d)یک پوشه موقت (با یک نام منحصر به فرد و غیر اشغال شده) ایجاد می کند و دایرکتوری فعلی را به آن تغییر می دهد (مانند دستور cd).
همچنین به –bare و –mirror گزینه ها. آنها اطمینان می دهند که هیچ دایرکتوری کاری ایجاد نمی شود. در نتیجه، هیچ هد بررسی نمی شود (زمانی که نیازی به کار مستقیم روی محتوای مخزن نداریم، بی فایده است). به همین دلیل است که عملیات کلون برهنه سریعتر از کلون معمولی است. اگر میخواهید تگها را نیز فشار دهید، فقط آن را حذف کنید –no-tags گزینه.
برای ارسال تغییرات به مخزن هدف، می توانید از دستور git push استفاده کنید. در مورد یک شاخه، اگر نیازی به فشار دادن برچسب ها ندارید، گزینه –tags را حذف کنید:
git push –tags
یا برای انعکاس کل مخزن:
git push –mirror
مراقب باشید که چنین فشاری تمام فشارهای اجباری و حذف شاخه ها را نیز (سعی می کند) تکرار کند! برخی از داده ها ممکن است پس از آن عملیات عملاً از بین بروند. محدودیتهای اعمالشده توسط میزبانها مانند شاخههای محافظتشده یا عدم توانایی در حذف شعبه پیشفرض همچنان باقی خواهند ماند.
اطمینان حاصل کنید که کاربری که فشار از طرف او انجام می شود مجوزهای مناسب را دارد. آنها باید بتوانند در مخزن بنویسند اما نباید امتیازات مدیریت داشته باشند!
بسته شدن
الزام به ذخیره کد در مخزن مشتری همیشه به این معنی نیست که شما باید از مخزن آنها استفاده کنید. شما به سادگی می توانید با استفاده از چند خط از اسکریپت پوسته، مخزن داخلی خود را با مخزن مشتری خود همگام کنید.
به خاطر داشته باشید که فشار ممکن است شکست بخورد (که نباید بر بقیه گردش کار شما تأثیر بگذارد) یا به طور برگشت ناپذیر داده ها را بازنویسی کند. امیدوارم به لطف این مقاله، نحوه کپی کردن یک مخزن git را بدانید. موفق باشید!
این پست برای اولین بار در Droids On Roids ظاهر شد.
یاد بگیرید که چگونه یک مخزن git را در چند مرحله ساده آینه کنید
زمینه
قبل از اینکه نحوه کپی کردن یک مخزن git را توضیح دهم، اجازه دهید زمینه را برای شما توضیح دهم. در Droids On Roids، ما ترجیح می دهیم از ابزارهای خودمان برای CI/CD، میزبانی VCS و سایر فرآیندها استفاده کنیم. همه توسعه دهندگان ما آنها را به خوبی می شناسند، که در مقایسه با استفاده از ابزارهای مشتریان جداگانه برای هر پروژه، سرعت توسعه را افزایش می دهد.
معمولاً مهم نیست که از چه چیزی در داخل استفاده می کنیم. با این حال، در مورد مخزن، مشتریان ممکن است بخواهند کد را در سرورهای تحت کنترل خود ذخیره کنند. این کاملاً قابل درک است، زیرا آنها معمولاً مالکیت معنوی را نیز خریداری می کنند، بنابراین آنها مالک کل کد هستند.
گاهی اوقات آن میزبانی در سمت مشتری ممکن است کامل نباشد.
به عنوان مثال، ممکن است از یک ارائه دهنده متفاوت استفاده کند. GitLab به جای GitHub که ما روزانه از آن استفاده می کنیم. یا حتی ممکن است یک سرور Git خود میزبان بدون هیچ گونه رابط وب باشد که تنها با استفاده از یک کلید قابل دسترسی است.
چگونه میتوانیم یک فرآیند بازبینی کد یا راهاندازی وب هوکها برای CI را روی چیزی شبیه به آن انجام دهیم؟ بیایید ببینیم چه کاری می توانیم انجام دهیم!
موارد
اولاً، لزوم ذخیره کد در یک مکان خاص به این معنی نیست که آن تنها مکان است.
ما هنوز هم میتوانیم از GitHub مورد علاقه خود برای توسعه روزانه استفاده کنیم و فقط کدها را در مخزن مشتری کپی کنیم.
برای انجام کارآمد آن، اجازه دهید ابتدا به چند سوال پاسخ دهیم.
- آیا باید همه چیز را آینه کنیم، یا فقط شاخه ها و/یا برچسب های خاص؟
- محرک عمل آینه چیست؟
معمولاً مشتری فقط به برخی از نقاط عطف/انتشارها علاقه دارد و نه همه کارهای میانی. در چنین حالتی، ما معمولاً می خواهیم فقط شاخه اصلی و شاید برخی از برچسب ها را آینه کنیم.
توجه داشته باشید که ما در اینجا هیچ مشکل قانونی را در نظر نمی گیریم. بررسی کنید که آیا محدودیتی در مورد مکان ذخیره سازی در قرارداد وجود ندارد. گاهی اوقات ممکن است فشار دادن کد به ابرهای عمومی ممنوع باشد.
دامنه
انعکاس همه چیز ممکن است، اما به خاطر داشته باشید که پیکربندی میزبانی هدف باید با منبع سازگار باشد.
به عنوان مثال، شاخه های حاوی فشارهای فشاری روی منبع نباید روی هدف محافظت شوند. فشار دادن برخی از سازه هایی که در سمت هدف استفاده نمی شوند نیز ممکن است باعث ایجاد خطا یا اخطار شوند. Gerrit ارجاعاتی ایجاد می کند (که لزوماً به شاخه ها یا برچسب ها اشاره نمی کنند) که ممکن است برای افرادی مانند GitHub قابل درک نباشد.
ماشه تفنگ
آینهسازی اغلب زمانی که به نقطه عطفی دست مییابد، مانند در پایان تکرار/دوی سرعت یا فقط به طور منظم، بهعنوان مثال، آغاز میشود. هفتگی یا روزانه من توصیه میکنم این عملیات را روی یک ساخت CI جداگانه انجام دهید، نه چیزی که حتی میتوانید به مناسبت آن را داشته باشید.
به عنوان مثال، حتی اگر یک ساخت «sprint» دارید که محصول را منتشر میکند، نباید آینهکاری را به عنوان یکی از مراحل/مراحل آن اضافه کنید. چرا؟
خب، شما هیچ کنترلی روی مخزن هدف ندارید. اگر یک مخزن غیرقابل دسترسی شود، شخصی کلید را باطل کند یا همان برچسبی را که میخواهید فشار دهید فشار دهد، در این صورت انعکاس شما با شکست مواجه میشود، حتی اگر مصنوع با موفقیت منتشر شده باشد.
علاوه بر این، کپی محلی که برای ساخت محصول استفاده میشود، ممکن است شعبهای را که میخواهید منعکس کنید، پرداخت نکند، اما در عوض یک commit خاص را بهعنوان یک HEAD جدا شده بررسی میکند.
به عنوان مثال، در Bitrise CI یک ماشه مرتبط با یک عمل فشار (به شاخه) commit تحت فشار را بررسی می کند. در نقطه تریگر در بالای شاخه قرار داشت اما در زمان ساخت (کلونینگ)، ممکن است کامیت های جدیدی بعد از آن ظاهر شود، زیرا ممکن است در این بین فشارهایی وجود داشته باشد.
کد
بیایید شروع به کدنویسی کنیم! Mirroring خود از 2 عملیات تشکیل شده است:
- شبیه سازی (یا تهیه یک نسخه از قبل شبیه سازی شده).
- هل دادن.
برای مثال، دسترسی به مخازن با فعال کردن کلیدهای SSH خارج از محدوده است، اما در صورت نیاز، باید قبل از دسترسی به مخزن خاص انجام شود.
در مورد ساخت تازه (توصیه شده)، شبیه سازی برای یک شاخه به این صورت است:
git clone --bare --single-branch --no-tags --branch=
.
یا مانند این برای کل مخزن:
git clone --mirror
.
جایی که
نام شاخه ای است که می خواهید شبیه سازی کنید، و
URL منبع (نه هدف!) مخزن است. به نقطه انتهایی توجه کنید! به معنی دایرکتوری فعلی است.
از خالی بودن آن مطمئن شوید. برخی از پلتفرمهای CI ممکن است برخی فایلهای موقت را در آنجا ایجاد کنند یا دایرکتوری اولیه را روی چیزی که معمولاً خالی نیست، مانند $HOME تنظیم کنند. در چنین مواردی از قبل این دستور را اجرا کنید: pushd $(mktemp -d)
یک پوشه موقت (با یک نام منحصر به فرد و غیر اشغال شده) ایجاد می کند و دایرکتوری فعلی را به آن تغییر می دهد (مانند دستور cd).
همچنین به --bare
و --mirror
گزینه ها. آنها اطمینان می دهند که هیچ دایرکتوری کاری ایجاد نمی شود. در نتیجه، هیچ هد بررسی نمی شود (زمانی که نیازی به کار مستقیم روی محتوای مخزن نداریم، بی فایده است). به همین دلیل است که عملیات کلون برهنه سریعتر از کلون معمولی است. اگر میخواهید تگها را نیز فشار دهید، فقط آن را حذف کنید --no-tags
گزینه.
برای ارسال تغییرات به مخزن هدف، می توانید از دستور git push استفاده کنید. در مورد یک شاخه، اگر نیازی به فشار دادن برچسب ها ندارید، گزینه –tags را حذف کنید:
git push --tags
یا برای انعکاس کل مخزن:
git push --mirror
مراقب باشید که چنین فشاری تمام فشارهای اجباری و حذف شاخه ها را نیز (سعی می کند) تکرار کند! برخی از داده ها ممکن است پس از آن عملیات عملاً از بین بروند. محدودیتهای اعمالشده توسط میزبانها مانند شاخههای محافظتشده یا عدم توانایی در حذف شعبه پیشفرض همچنان باقی خواهند ماند.
اطمینان حاصل کنید که کاربری که فشار از طرف او انجام می شود مجوزهای مناسب را دارد. آنها باید بتوانند در مخزن بنویسند اما نباید امتیازات مدیریت داشته باشند!
بسته شدن
الزام به ذخیره کد در مخزن مشتری همیشه به این معنی نیست که شما باید از مخزن آنها استفاده کنید. شما به سادگی می توانید با استفاده از چند خط از اسکریپت پوسته، مخزن داخلی خود را با مخزن مشتری خود همگام کنید.
به خاطر داشته باشید که فشار ممکن است شکست بخورد (که نباید بر بقیه گردش کار شما تأثیر بگذارد) یا به طور برگشت ناپذیر داده ها را بازنویسی کند. امیدوارم به لطف این مقاله، نحوه کپی کردن یک مخزن git را بدانید. موفق باشید!
این پست برای اولین بار در Droids On Roids ظاهر شد.