سلة مفاجأة - انقاذ دفعنا

TLDR: صنع مجموعة من البرامج النصية لأتمتة ترحيل مستودعات Bitbucket من Mercurial إلى Git.

في أحد الأيام الجميلة ، أعلنت خدمة استضافة مستودع Bitbucket المفضلة لدي أنها ستتوقف قريبًا عن دعم مستودعات Mercurial لصالح Git ، وبعد ذلك سيتم حذف جميع مستودعات Mercurial.

صورة

لدي العديد من مستودعات Mercurial الخاصة على Bitbucket ، لم أكن أرغب في فقدانها ، تمامًا مثل تاريخ ارتكابها. الانتقال إلى استضافة أخرى ليس خيارًا أيضًا - أنا معتاد على Bitbucket. من الغريب أن Bitbucket أنفسهم لم يتمكنوا من عمل محول في المكان. حتى أنهم لم يكتبوا أي تعليمات خطوة بخطوة للتحويل ، وإرسال الجميع إلى منتدى مجتمعهم - بصياغة يسوعية إلى حد ما (يسعدنا دعم عملية الترحيل الخاصة بك ، ويمكنك العثور على مناقشة حول الخيارات المتاحة في سلسلة المنتدى المخصصة لدينا) - يقولون يسعدنا نقل مستودعاتك تحت Git ، وكيفية القيام بذلك - ناقشها بنفسك في المنتدى. ومع ذلك ، في نفس المنشور تركوا روابط لزوج من محولات تصدير hg-fast و hg-git .

الأول هو نص Python منفصل ، والثاني هو مكون إضافي للعمل مع مستودعات Git مباشرة من Mercurial. كما وجدت Google عددا من الأمثلة على كيفية حل آخرين مهمة سحب وإسقاط زئبقي تحت بوابة: لو ، ها ، و الصغرى . كما استخدموا إما تصدير الزئبق بسرعة أو الزئبق-جيت. والثاني كان بالفعل حلاً مثبتًا بالنسبة لي - كنت أستخدم hg-git أحيانًا عندما كنت ملتزمًا بـ Github من Mercurial - حتى أدركت أنه في Git ، الغريب ، من الأفضل الالتزام من Git. لذلك لأغراضي ، اخترت hg-git.

هناتم إعطاء برنامج Powershell لأتمتة ترحيل المستودع ، والذي كان نقطة البداية في حل بلدي ، ولكن بالنسبة إلى Linux ، كان علي إعادة كتابته إلى Bash. بالإضافة إلى ذلك ، يتم ترحيل النص الأصلي فقط إلى مستودع Git المحلي ، وأضفت القدرة على دفع محتويات مستودع Git المحول إلى مستودع Bitbucket هناك. إليك ما يبدو عليه البرنامج النصي الناتج:

$ ./convert_repo.sh lebedevsergey advertisements_parser
2a51eee7ade0
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 5 changes to 5 files
updating to branch default
5 files updated, 0 files merged, 0 files removed, 0 files unresolved
Initialized empty Git repository in /home/serge/project/_probes/hg2git/src/advertisements_parser-git/
pushing to ../advertisements_parser-git
searching for changes
adding objects
added 1 commits with 2 trees and 5 blobs
error: Could not remove config section 'remote.origin'
Branch master set up to track 

الآن لدي حل جاهز ، ولكنه يتطلب إجراءات يدوية - قبل إطلاقه ، كان عليك أولاً إنشاء مستودع Git على Bitbucket بحيث يكون هناك الكثير لدفع النتيجة. بالنظر إلى مستودعاتي التي يبلغ عددها 100500 ليتم تحويلها ، أدركت أنني سأعالجها لفترة طويلة ، وأود أن يقوم البرنامج النصي نفسه بإنشاء مستودعات Git للمستودعات المحولة ، والأفضل من ذلك - سيحصل على قائمة بمستودعات Mercurial الخاصة بي والعمل عليها. من الواضح أن هذا تجاوز مهارة Mercurial الخالصة ، وهنا كانت هناك حاجة إلى وظيفة Bitbucket نفسها ، أو بالأحرى واجهة Bitbucket API .

هناك مكتبات جاهزة للعمل مع واجهة برمجة تطبيقات Bitbucket للعديد من لغات البرمجة ، خاصة لـ Python - على ما يبدو SDK الرسمي(لا ينبغي الخلط بينه وبين المهجورة منذ فترة طويلة ، ولكن بمجرد أن لا تقل SDK الرسمية عن Bitbucket نفسها ). هناك أيضًا عملاء Bitbucket API لـ Java و NodeJS و PHP . آخر واحد اخترت.

ومع ذلك ، عندما تمت دراسته بالتفصيل ، اتضح أنه لم يتم تنفيذه للحصول على قائمة بمستودعات المستخدمين وإنشاء مستودع جديد. لحسن الحظ ، قدم منشئو المكتبة إمكانية توسيع فصولهم من خلال جعل الأساليب الخاصة محمية ، بحيث يمكنك عن طريق وراثة فئة عميل API الخاص بهم ، إضافة طرقك الخاصة التي تفعل ما أحتاجه:

class ExtendedClient extends Client
{
    /**
     * @return \Bitbucket\Api\Repositories
     */
    public function repositories()
    {
        return new ExtendedRepositories($this->getHttpClient());
    }
}

class ExtendedRepositories extends Repositories
{    
    public function listWorkspace(string $workspaceName, array $params = [])
    {
        $path = $this->buildRepositoriesPath($workspaceName);
        return $this->get($path, $params);
    }

    public function create(string $workspaceName, string $repoName, array $params = [])
    {
        $path = $this->buildRepositoriesPath($workspaceName, $repoName);

        return $this->post($path, $params);
    }
}

بعد ذلك ، كتبت بضعة سكربتات PHP ونص Bash آخر لتشغيلها ، وبعد ساعة يمكنني بالفعل الإعجاب بجهاز كمبيوتر مثبت لي:

Checking repository: mysett
Trying to create Git repository: git_mysett
Created Git repository: git_mysett
20abecfb36fe
applying clone bundle from https://api.media.atlassian.com/file/4d5980dc-148f-400c-97f7-8067506778a5/binary?client=403e8d2f-6661-452a-8307-5c68f82c1a13&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3MiOnsidXJuOmZpbGVzdG9yZTpmaWxE2bUg7aRIzuKbjwOn5SF8IbGEVs33WHDVb-JYto
adding changesets
adding manifests
adding file changes
added 27 changesets with 56 changes to 41 files
finished applying clone bundle
searching for changes
no changes found
updating to branch default
35 files updated, 0 files merged, 0 files removed, 0 files unresolved
Initialized empty Git repository in /home/serge/project/hg2git/src/mysett-git/
pushing to ../mysett-git
searching for changes
adding objects
added 27 commits with 82 trees and 50 blobs
error: Could not remove config section 'remote.origin'
Counting objects: 159, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (133/133), done.
Writing objects: 100% (159/159), 12.95 MiB | 7.95 MiB/s, done.
Total 159 (delta 0), reused 159 (delta 0)
To git@bitbucket.org:lebedevsergey/git_mysett.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
Checking repository: jazzz
Trying to create Git repository: git_jazzz

ونتيجة لذلك ، استغرق التحويل حوالي ساعة للعمل ، وبعد ذلك أتصفح الآن مستودعات Git المحولة في الخلفية للتأكد من عدم فقد أي شيء. وبعد ذلك فقط أحذف مستودعات Mercurial الأصلية بيدي. بالطبع ، لا شيء يمنع إضافة إزالة من مستودع Bitbucket Mercurial بعد التحويل إلى البرنامج النصي ، ولكن في رأيي ، هذا هو الحال عندما يمكن أن تتسبب الأتمتة المفرطة في تلفها.

توجد مجموعة جاهزة من البرامج النصية لأتمتة ترحيل المستودعات هنا

ملاحظة:أغتنم هذه الفرصة ، سأطرح السؤال البلاغي - لماذا هو Git ، الذي يعمل في بعض الأحيان مع منطق غير واضح إلى حد ما ، وأكثر شعبية بكثير من Mercurial الأكثر منطقية ، حيث تقوم بالالتزام ، وإنشاء الفروع ، وإذا حدث خطأ ما ، قم بالتراجع عن الالتزامات دون التفكير في ما تحت غطاء نظام التحكم في الإصدار ، وحول المؤشر إلى الرأس ، ولكن فقط تفعل ما تحتاجه؟ في رأيي ، هذا غير عادل ، لأن الواضح هو أفضل من غير الواضح ، ومن المحزن للغاية أن Bitcurket ، أحد أعمدة مقاومة التيار في أنظمة التحكم في الإصدار ، يتوقف عن دعم Mercurial.

All Articles