مهاجرت بدون درد و خونریزی از گیت‌هاب به هرجا

خبر بد و کوتاه بود، امّا شوکه‌کننده نه. گیت‌هاب هم به جمع تحریم‌کنندگان توسعه‌دهندگان ایرانی پیوسته و دارد آن‌ها را به مخزن‌های رایگان و عمومی محدود می‌کند. محدودیّتی که معلوم نیست شدیدتر بشود یا نه. به علاوه بخش‌های رایگانی مثل Github Pages را هم دارد از ما دریغ می‌کند.

چطوری بدون از دست دادن تاریخچه‌ی عملکرد گیتمان آن را به جای دیگری منتقل کنیم؟ این سؤالی است که الان همه‌ی ما داریم. من در اینجا دو روش را برای این انتقال به شما نشان می‌دهم.

حواستان باشد که این روش‌ها هیچ‌کدام به گیت‌هاب محدود نیستند. یعنی شما می‌توانید به هر دلیلی و هر مخزن گیتی را به صورت کامل به مخزن دیگری منتقل کنید و یا کاری کنید که تغییراتتان روی یک کد، هم‌زمان روی چندین مخزن مختلف اعمال شود.

گیت‌لب و چند کلیک ساده

اوّلین گزینه سایت Gitlab است. البته اگر یادتان نرفته این سایت هم ما را مدّت‌ها پیش تحریم کرد. به همین خاطر بهتر است همواره با یکی از روش‌های تغییر IP از آن استفاده کنید.

گیت‌لب امکان انتقال کامل یک مخزن (repository) را از گیت‌هاب فراهم کرده است. وقتی می‌گوییم کامل، یعنی واقعاً کامل. حتّی Issue ها و Pull Request ها را هم منتقل می‌کند و اگر افرادی که در آن‌ها حضور دارند را در گیت‌لب پیدا کند، دوباره آن‌ها را به آن بخش مرتبط می‌کند.

اوّلین مرحله این است که شروع به ساخت یک پروژه‌ی جدید بکنید.

در صفحه‌ی ساخت پروژه، از گزینه‌های بالا Import project را انتخاب کنید و از گزینه‌های موجود، Github را انتخاب کنید.

بعد از اینکه اکانت گیت‌هابتان را به گیت‌لب اضافه کردید زمان آن است که مخزنی که می‌خواهید جابه‌جایش کنید را از لیست مخزن‌هایتان انتخاب کنید:

بعد از این کار مخزن به اوّل لیست انتقال پیدا می‌کند و هم‌زمان وارد لیست پروژه‌هایتان می‌شود.

حالا کار شما تمام شده است. زمان زیادی صفحه‌ی پروژه‌تان این‌طوری خواهد بود، ولی خوبیش این است که دیگر لازم نیست شما کاری بکنید.

همین. تمام شد.

انتقال از طریق خود گیت به هرجایی

راه حل دیگر به پلتفرم خاصی محدود نیست. شما می‌توانید با این مراحل مخزن گیت‌تان را به همراه تمام تاریخچه و branch ها و… به هر پلفترمی که دلتان می‌خواد انتقال بدهید.

فقط حواستان باشد در این جا تمام اطّلاعاتی که مربوط به خود گیت می‌شوند انتقال پیدا می‌کنند. یعنی مواردی که به پلتفرم‌ها مرتبط هستند، مثل issue ها و pull request ها، دیگر منتقل نخواهند شد.

من برای نمایش تغییرات در این نوشته از پلتفرم BitBucket استفاده کرده‌ام، ولی شما از هر سیستم عمومی یا خصوصی دیگری که دلتان بخواهد می‌توانید استفاده کنید. اصلاً هم مهم نیست که پروژه پیش از این روی گیت‌هاب بوده است یا نه. روی هر پروژه‌ی گیتی کار می‌کند.

اطمینان از اینکه مخزن را به شکل کامل داریم

اوّل باید مطمئن بشویم که کل مخزن را داریم. برای همین دستور زیر را می‌زنیم تا تمامی branch ها و تگ‌ها را دریافت کنیم:

git fetch origin

خروجی این دستور هر چیزی می‌تواند باشد. مثلاً برای مخزن پکیج wordcloud-fa من، خروجی این خواهد بود:

From github.com:alihoseiny/word_cloud_fa
 * [new tag]         0.1        -> 0.1
 * [new tag]         0.1.2      -> 0.1.2
 * [new tag]         0.1.3      -> 0.1.3

حالا لیستی از تمام branch های پروژه را می‌گیریم:

git branch -a

اگر در خروجی این دستور branchی وجود داشت که از آن روی دستگاهتان کپی‌ای ندارید، باید با دستور زیر یک کپی از آن بسازید:

git checkout -b <branch> origin/<branch>

به جای <branch> نام branch ی که می‌خواهید یک نسخه‌ی کپی از آن روی دستگاهتان درست شود را بنویسید و این کار را برای تمامی branch هایی که قبلاً روی دستگاهتان نبوده اند تکرار کنید.

افزودن مخزن جدید

حالا زمان این است که مخزن جدیدمان را اضافه کنیم.

من اوّل روی bitbucket یک مخزن جدید ساختم:

حالا زمان این است که مخزن قبلی را به صورت کامل به این مخزن جدید منتقل کنیم.

اوّل از همه باید مخزن جدید را به لیست remote های گیت اضافه کنیم:

git remote add bb-origin https://alihoseiny@bitbucket.org/alihoseiny/wordcloud-fa.git

bb-origin اسمی است که من روی این مخزن گذاشته ام. شما هر اسم دیگری که دلتان بخواهد را می‌توانید انتخاب کنید. فقط حواستان باشد که نباید پیش از این remoteی با این اسم اضافه کرده باشید.

مقداری هم که مقابل این اسم قرار می‌گیرد آدرس مخزن ما است که هر جایی می‌تواند باشد.

انتقال مخزن به خانه‌ی جدیدش

حالا زمان این است که مخزنمان را به خانه‌ی بخت بفرستیم. برای اینکه مخزن به شکل کامل در جای جدیدی که ساخته‌ایم کپی شود، کافی است دستور زیر را اجرا کنیم:

git push --all bb-origin

حالا مخزن به شکل کامل منتقل شده است و می‌توانیم تمامی فایل‌ها و تاریخچه‌ی کاملش را در محل جدید داشته باشیم.

همین. باز هم به همین سادگی مخزن ما به طور کامل منتقل شد. فقط حواستان باشد وقتی که remote دوم را اضافه می‌کنید، گاهی اوقات ssh بازی در می‌آورد. راه حل ساده‌اش مثل اینجا این است که از همان https ساده استفاده کنیم.

استفاده از چندین مخزن پشتیبان

حالا کارمان با انتقال مخزن تمام شد. امّا می‌توانیم یک کار خیلی خوب و راحت انجام بدهیم که اگر بعداً هم هر مشکلی پیش آمد مثل ماجرای گیت‌هاب دست و پایمان را گم نکنیم.

الان می‌خواهیم یک مخزن پشتیبان (backup) برای مخزن خودمان تعریف کنیم. یعنی هر بار که push می‌کنیم، علاوه بر مخزن اصلی، تغییرات روی یک مخزن دیگر هم اعمال شود.

از آنجایی که گیت‌هاب هنوز با اکانت من کاری نداشته، من می‌خواهم که از آن به عنوان مخزن اصلی استفاده کنم، امّا اکانت Bitbucketم را به عنوان اکانت پشتیبانش قرار بدهم تا اگر فرداروزی اکانتم مسدود شد ابداً لازم نباشد کاری بکنم.

برای این کار کافی است که دو تا remote جدید برای push تعریف کنیم. یکی که باید همان مخزن گیت‌هاب که مخزن اصلی است باشد و یکی هم مخزنی که روی Bitbucket ساخته‌ام.

اوّل مخزن اصلی را (که همین الان هم می‌شود رویش push کرد) اضافه می‌کنم:

git remote set-url --add --push origin git@github.com:alihoseiny/word_cloud_fa.git

حالا باید مخزن پشتیبان را اضافه کنم:

git remote set-url --add --push origin https://alihoseiny@bitbucket.org/alihoseiny/wordcloud-fa.git

حالا می‌توانیم لیست مخزن‌هایمان را برای اینکه مطمئن شویم ببینیم:

git remote show origin

خروجی نشان می‌دهد که مخزن پشتیبان با موفّقیّت اضافه شده است:

* remote origin
  Fetch URL: git@github.com:alihoseiny/word_cloud_fa.git
  Push  URL: git@github.com:alihoseiny/word_cloud_fa.git
  Push  URL: https://alihoseiny@bitbucket.org/alihoseiny/wordcloud-fa.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

حالا هر وقت که push بکنیم تغییرات به صورت هم‌زمان به هر دو مخزن فرستاده می‌شود. مثلاً من یک خط خالی آخر فایل README.md اضافه کردم و این تغییر را commit کردم.

git commit -am"Add a newline at the end of readme file for testing multiple push"

حالا می‌توانم دقیقاً مثل قبل تغییراتم را push کنم:

git push origin master

حالا اگر لیست تغییرات را در گیت‌هاب ببینیم، می‌توانیم commit آخر را در ابتدای لیست پیدا کنیم:

یک سری هم به مخزن پشتیبانمان می‌زنیم تا ببینیم تغییر را دریافت کرده است یا نه:

اینطوری دیگر نگرانی کمتری خواهیم داشت. حداقل تغییرات به صورت هم‌زمان روی چندین جای مختلف ذخیره شده است.

حواستان هم باشد که می‌توانید هر تعداد مخزن که می‌خواهید را به این روش اضافه کنید.


من این نوشته را پیش از این در وبلاگ شخصی‌ام منتشر کرده‌ام. برای خواندن این نوشته در آنجا و دیدن مطالب دیگری که در ویرگول منتشر نمی‌کنم، می‌توانید روی این نوشته کلیک کنید.

احترام به کپی‌رایت

برای ساخت تصویر ابتدای نوشته، از این تصویر و این تصویر از سایت flaticon استفاده شده است.