العمل بسرعة ، بأمان ، وبدون صداع. وصلت واجهة GIT التي فقدتها طوال حياتك أخيرًا.
احتفلت GIT مؤخرًا بالذكرى السنوية العشر السنوية ، لكن معظم المهندسين ما زالوا في حيرة من أمره (3 من أفضل 5 أسئلة في كل العصور على سعة مكدس ترتبط بالجيت). نظرًا لأن GIT يتحول حتى الإجراءات البسيطة إلى أوامر محير ("GIT ADD" إلى المرحلة مقابل "رأس إعادة ضبط GIT" لفصل أي شخص؟) ، فليس من المستغرب أن يضيع المستخدمون الوقت ، أو يشعرون بالإحباط ، أو صرف انتباه فريقهم للحصول على المساعدة ، أو ما هو أسوأ ، أو أسوأ ، المسمار ريبو!
Gitup هو رهان لاختراع نموذج تفاعل GIT جديد يتيح للمهندسين من جميع المستويات العمل بسرعة وأمان وبدون صداع. لا يختلف عن أي عميل آخر من العميل GIT هناك من الطريقة التي يتم بناؤها (تتفاعل مباشرة مع قاعدة بيانات GIT على القرص) ، إلى الطريقة التي يعمل بها (يمكنك معالجة الرسم البياني المستودع بدلاً من التلاعب بالالتزامات).
مع gitup ، ستحصل على عميل GIT فعال حقًا لنظام التشغيل Mac:
تم إنشاء Gitup بواسطة Swisspol في أواخر عام 2014 كرهان لإعادة اختراع الطريقة التي يتفاعل بها المطورون مع GIT. بعد عدة أشهر من العمل ، تم توفيره في أوائل عام 2015 وتوصل إلى قمة أخبار Hacker إلى جانب عرضه من خلال Hunt و Dowing Fireball. 30000 سطر من التعليمات البرمجية في وقت لاحق ، وصل Gitup إلى 1.0 في منتصف أغسطس 2015 وتم إصداره مفتوح المصدر كهدية لمجتمع المطورين.
brew install homebrew/cask/gitup (ملاحظة: هناك بالفعل صيغة تسمى gitup ، لذلك يجب تحديد الاسم الكامل!)اقرأ المستندات واستخدم مشكلات github للدعم والتعليقات.
تتوفر ملاحظات الإصدارات في https://github.com/git-up/gitup/release. يتم إصدار تصميمات موسومة بـ v (على سبيل المثال v1.2.3 ) على القناة "المستقرة" ، بينما يتم إصدار تصميمات الموسومة بـ b (على سبيل المثال b1234 ) فقط على القناة "المستمرة". يمكنك تغيير قناة التحديث المستخدمة بواسطة gitup في تفضيلات التطبيق.
لبناء gitup بنفسك ، ما عليك سوى تشغيل command git clone --recursive https://github.com/git-up/GitUp.git في terminal ، ثم افتح مشروع GitUp/GitUp.xcodeproj xcode وضرب التشغيل.
مهم: إذا لم يكن لديك معرف Apple مع حساب مطور لتطبيقات Mac Code ، فسوف يفشل البناء مع خطأ في توقيع الكود. ما عليك سوى حذف إعداد بناء "توقيع الكود هوية" هدف "التطبيق" للتغلب على المشكلة:
بدلاً من ذلك ، إذا كان لديك حساب مطور ، فيمكنك إنشاء ملف "Xcode-Configurations/Development_team.xcconfig" مع إعداد البناء التالي كمحتوى له:
Development_team = [TeamID الخاص بك]
للحصول على وصف أكثر تفصيلاً لهذا ، يمكنك إلقاء نظرة على التعليقات في نهاية الملف "Xcode-Configurations/base.xcconfig".
تم تصميم Gitup كطبقة رقيقة أعلى مجموعة أدوات GIT عامة قابلة لإعادة الاستخدام تسمى "Gitupkit". هذا يعني أنه يمكنك استخدام إطار عمل GituPkit نفسه لبناء واجهة مستخدم GIT الخاصة بك!
Gitupkit لديه هدف مختلف تمامًا عن GoveryGit. بدلاً من تقديم روابط خام واسعة النطاق لـ libgit2 ، يستخدم GituPkit فقط مجموعة فرعية قليلة من libgit2 وإعادة تنفيذ كل شيء آخر فوقه (له "محرك Rebase" الخاص به على سبيل المثال). هذا يسمح لها بفضح واجهة برمجة تطبيقات ضيقة ومتسقة للغاية ، والتي تتبع تمامًا اتفاقيات OBJ-C وتخفي تعقيد libgit2 وأحيانًا التناقضات. يضيف GituPkit إلى أعلى عدد من الميزات الحصرية والقوية ، من التراجع/Redo و Time Machine مثل اللقطات ، إلى مكونات واجهة المستخدم بالكامل.
يتم تنظيم رمز مصدر GituPkit كطبقتين مستقلتين يتواصلان فقط من خلال استخدام واجهات برمجة التطبيقات العامة:
الطبقة الأساسية (تعتمد على الأساس فقط وهي متوافقة مع OS X و IOS)
Core/ : Wrapper حول الحد الأدنى المطلوب من وظائف libgit2 ، فوقها يتم تنفيذها بعد ذلك جميع وظائف Git التي تتطلبها Gitup (لاحظ أن Gitup يستخدم شوكة مخصصة قليلاً من libgit2)Extensions/ : فئات على الفئات Core لإضافة ميزات الراحة التي يتم تنفيذها فقط باستخدام واجهات برمجة التطبيقات العامةطبقة واجهة المستخدم (تعتمد على appkit وهي متوافقة مع OS X فقط)
Interface/ : فئات العرض منخفضة المستوى على سبيل المثال GIGraphView لتقديم عرض خريطة gitupUtilities/ : فئات الأداة المساعدة على سبيل المثال فئة وحدة التحكم في العرض الأساسي GIViewControllerComponents/ : وحدات التحكم في عرض عرض واحد قابلة لإعادة الاستخدام ، مثل GIDiffContentsViewControllerViews/ : رفيعة المستوى القابلة لإعادة الاستخدام متعددة المراكز عرض وحدات تحكم على سبيل المثال GIAdvancedCommitViewController هام : إذا تم تعريف DEBUG المستمر المسبق للمعالج إلى قيمة غير صفرية عند إنشاء GituPkit (هذا هو الافتراضي عند بناء تكوين "Debug") ، يتم تمكين عدد من عمليات فحص الاتساق الإضافية في وقت التشغيل بالإضافة إلى تسجيل إضافي. كن على علم بأن هذا النفقات العامة يمكن أن يؤثر بشكل كبير على الأداء.
يجب أن يكون استخدام واجهة برمجة تطبيقات GituPkit واضحة تمامًا نظرًا لأنه يتم تنظيمه بواسطة الوظيفة (مثل المستودع ، والفروع ، والرابطة ، ومكونات الواجهة ، وما إلى ذلك ...) وقد بذلت أفضل جهد لتسمية وظائف بوضوح.
فيما يتعلق بآبار واجهات برمجة التطبيقات "الأساسية" ، فإن أفضل طريقة لتعلمها هي الاطلاع على اختبارات الوحدة المرتبطة - على سبيل المثال ، انظر اختبارات الفرع لآبار واجهة برمجة تطبيقات الفرع.
فيما يلي بعض رمز العينة لتبدأ (يتم ترك معالجة الأخطاء كتمرين للقارئ):
فتح وتصفح مستودع:
// Open repo
GCRepository* repo = [[GCRepository alloc ] initWithExistingLocalRepository: <PATH> error: NULL ];
// Make sure repo is clean
assert ([repo checkClean: kGCCleanCheckOption_IgnoreUntrackedFiles error: NULL ]);
// List all branches
NSArray * branches = [repo listAllBranches: NULL ];
NSLog ( @" %@ " , branches);
// Lookup HEAD
GCLocalBranch* headBranch; // This would be nil if the HEAD is detached
GCCommit* headCommit;
[repo lookupHEADCurrentCommit: &headCommit branch: &headBranch error: NULL ];
NSLog ( @" %@ = %@ " , headBranch, headCommit);
// Load the *entire* repo history in memory for fast access, including all commits, branches and tags
GCHistory* history = [repo loadHistoryUsingSorting: kGCHistorySorting_ReverseChronological error: NULL ];
assert (history);
NSLog ( @" %lu commits total " , history.allCommits.count);
NSLog ( @" %@ n %@ " , history.rootCommits, history.leafCommits);تعديل مستودع:
// Take a snapshot of the repo
GCSnapshot* snapshot = [repo takeSnapshot: NULL ];
// Create a new branch and check it out
GCLocalBranch* newBranch = [repo createLocalBranchFromCommit: headCommit withName: @" temp " force: NO error: NULL ];
NSLog ( @" %@ " , newBranch);
assert ([repo checkoutLocalBranch: newBranch options: 0 error: NULL ]);
// Add a file to the index
[[ NSData data ] writeToFile: [repo.workingDirectoryPath stringByAppendingPathComponent: @" empty.data " ] atomically: YES ];
assert ([repo addFileToIndex: @" empty.data " error: NULL ]);
// Check index status
GCDiff* diff = [repo diffRepositoryIndexWithHEAD: nil options: 0 maxInterHunkLines: 0 maxContextLines: 0 error: NULL ];
assert (diff.deltas.count == 1 );
NSLog ( @" %@ " , diff);
// Create a commit
GCCommit* newCommit = [repo createCommitFromHEADWithMessage: @" Added file " error: NULL ];
assert (newCommit);
NSLog ( @" %@ " , newCommit);
// Restore repo to saved snapshot before topic branch and commit were created
BOOL success = [repo restoreSnapshot: snapshot withOptions: kGCSnapshotOption_IncludeAll reflogMessage: @" Rolled back " didUpdateReferences: NULL error: NULL ];
assert (success);
// Make sure topic branch is gone
assert ([repo findLocalBranchWithName: @" temp " error: NULL ] == nil );
// Update workdir and index to match HEAD
assert ([repo resetToHEAD: kGCResetMode_Hard error: NULL ]); GitDown هو تطبيق أساسي للغاية يطالب المستخدم بإعادة الريبو ويعرض قائمة تفاعلية وإنهاء مباشر من مخبأاته (كلها مع حوالي 20 خطًا من التعليمات البرمجية في -[AppDelegate applicationDidFinishLaunching:] ):
من خلال GituPkit ، يحصل هذا التطبيق الأساسي أيضًا على Diffs Unlimited Unlimited Undo/Redo ، وموحدة وجرفًا ، واختيار النصوص والنسخ ، واختصارات لوحة المفاتيح ، وما إلى ذلك ...
يوضح هذا الكود المصدر أيضًا كيفية استخدام بعض وحدات التحكم في عرض GituPkit وكذلك بناء واحدة مخصصة.
يوضح GitDiff كيفية إنشاء وحدة تحكم عرض يعرض فرقًا مباشرًا بين HEAD و Workdir à la git diff HEAD :
GITY عبارة عن استنساخ GITX تم تصميمه باستخدام GituPkit وأقل من 200 سطر من التعليمات البرمجية:
IGIT هو تطبيق اختبار iOS الذي يستخدم ببساطة GituPkit لاستنساخ ريبو جيثب وأداء التزام.
انظر المساهمة.
أيضا شكر كبير للمساهمين libgit2 الرائعين الذين بدونهم لم يكن جيتوب موجودًا أبدًا!
Gitup هو حقوق الطبع والنشر 2015-2018 Pierre-Olivier Latour ومتوفر بموجب ترخيص GPL V3. راجع ملف الترخيص في المشروع لمزيد من المعلومات.
هام: تتضمن Gitup بعض المشاريع الأخرى مفتوحة المصدر ، وتبقى هذه المشاريع تحت رخصتها الخاصة.