ทำงานได้อย่างรวดเร็วปลอดภัยและไม่มีอาการปวดหัว อินเทอร์เฟซ GIT ที่คุณคิดถึงมาตลอดชีวิตในที่สุดก็มาถึงแล้ว
เมื่อเร็ว ๆ นี้ Git ฉลองครบรอบ 10 ปี แต่วิศวกรส่วนใหญ่ยังคงสับสนกับความซับซ้อนของมัน (3 ใน 5 คำถามสูงสุดตลอดเวลาในการล้นสแต็กนั้นเกี่ยวข้องกับ GIT) เนื่องจาก Git เปลี่ยนการกระทำที่เรียบง่ายให้กลายเป็นคำสั่งที่น่าประหลาดใจ (“ Git Add” ไปยังเวทีกับ“ Git Reset Head” เพื่อทำให้ทุกคนไม่มีใคร?) จึงไม่น่าแปลกใจที่ผู้ใช้เสียเวลาเสียเวลา สกรู repo ของพวกเขา!
Gitup เป็นการเดิมพันในการคิดค้นรูปแบบการโต้ตอบ GIT ใหม่ที่ให้วิศวกรทุกระดับทำงานได้อย่างรวดเร็วปลอดภัยและไม่มีอาการปวดหัว มันแตกต่างจากไคลเอนต์ GIT อื่น ๆ ออกมาจากที่มันสร้างขึ้น (มันโต้ตอบโดยตรงกับฐานข้อมูล GIT บนดิสก์) ไปจนถึงวิธีการทำงาน (คุณจัดการกราฟที่เก็บแทนที่จะจัดการกับการกระทำ)
ด้วย Gitup คุณจะได้รับไคลเอนต์ Git ที่มีประสิทธิภาพอย่างแท้จริงสำหรับ Mac:
Gitup ถูกสร้างขึ้นโดย @swisspol ในปลายปี 2014 เพื่อเป็นการเดิมพันเพื่อสร้างวิธีการที่นักพัฒนาโต้ตอบโต้ตอบกับ Git หลังจากทำงานมาหลายเดือนมันก็เปิดให้บริการในช่วงต้นปี 2558 และมาถึงจุดสูงสุดของข่าวแฮ็กเกอร์พร้อมกับการให้ความสำคัญกับการล่าผลิตภัณฑ์และลูกไฟที่กล้าหาญ รหัส 30,000 บรรทัดต่อมา Gitup ถึง 1.0 กลางเดือนสิงหาคม 2558 และได้รับการปล่อยตัวโอเพนซอร์สเป็นของขวัญให้กับชุมชนนักพัฒนา
brew install homebrew/cask/gitup
(หมายเหตุ: มีสูตรที่เรียกว่า Gitup อยู่แล้วดังนั้นต้องระบุชื่อเต็ม!)อ่านเอกสารและใช้ปัญหา GitHub เพื่อการสนับสนุนและข้อเสนอแนะ
มีการเปิดตัวบันทึกย่อที่ https://github.com/git-um/gitup/releases Builds Tagged ด้วย v
(เช่น v1.2.3
) ถูกปล่อยออกมาในช่อง "เสถียร" ในขณะที่สร้างแท็กด้วย A b
(เช่น b1234
) จะถูกปล่อยออกมาในช่อง "ต่อเนื่อง" เท่านั้น คุณสามารถเปลี่ยนช่องอัปเดตที่ใช้โดย Gitup ในการตั้งค่าแอป
ในการสร้าง Gitup ด้วยตัวคุณเองเพียงเรียกใช้คำสั่ง git clone --recursive https://github.com/git-up/GitUp.git
ในเทอร์มินัลจากนั้นเปิดโครงการ GitUp/GitUp.xcodeproj
Xcode แล้วกด Run
สำคัญ: หากคุณไม่มี Apple ID ที่มีบัญชีนักพัฒนาสำหรับแอพที่ลงนามในรหัส Mac การสร้างจะล้มเหลวด้วยข้อผิดพลาดในการลงนามรหัส เพียงแค่ลบการตั้งค่าการสร้าง "รหัสระบุรหัส" ของเป้าหมาย "แอปพลิเคชัน" เพื่อแก้ไขปัญหา:
อีกทางเลือกหนึ่ง หากคุณมีบัญชีนักพัฒนาคุณสามารถสร้างไฟล์ "XCode-Configurations/Development_Team.xcconfig" ด้วยการตั้งค่าการสร้างต่อไปนี้เป็นเนื้อหา:
Development_Team = [คุณเป็นทีมของคุณ]
สำหรับคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้คุณสามารถดูความคิดเห็นได้ในตอนท้ายของไฟล์ "Xcode-configurations/base.xcconfig"
Gitup ถูกสร้างขึ้นเป็นเลเยอร์บาง ๆ ที่ด้านบนของชุดเครื่องมือ Git ทั่วไปที่ใช้ซ้ำได้เรียกว่า "Gitupkit" ซึ่งหมายความว่าคุณสามารถใช้เฟรมเวิร์ก Gitupkit เดียวกันเพื่อสร้าง Git UI ของคุณเอง!
Gitupkit มีเป้าหมายที่แตกต่างจาก ObjectiveGit แทนที่จะเสนอการผูกดิบอย่างกว้างขวางกับ LibGit2 Gitupkit ใช้ชุดย่อยน้อยที่สุดของ LibGit2 และปรับปรุงทุกอย่างอื่น ๆ ที่อยู่ด้านบนของมัน (มันมี "rebase engine" ของตัวเอง) สิ่งนี้ช่วยให้สามารถเปิดเผย API ที่แน่นและสอดคล้องกันมากซึ่งเป็นไปตามการประชุม OBJ-C อย่างสมบูรณ์และซ่อนความซับซ้อนของ Libgit2 และบางครั้งก็ไม่สอดคล้องกัน Gitupkit เพิ่มคุณสมบัติพิเศษและทรงพลังจำนวนมากตั้งแต่ Undo/Redo และ Time Machine เช่นสแน็ปช็อตไปจนถึงส่วนประกอบ UI แบบดรอปอินทั้งหมด
ซอร์สโค้ด Gitupkit ถูกจัดระเบียบเป็น 2 ชั้นอิสระที่สื่อสารผ่านการใช้ API สาธารณะเท่านั้น:
ชั้นฐาน (ขึ้นอยู่กับรากฐานเท่านั้นและเข้ากันได้กับ OS X และ iOS)
Core/
: wrapper รอบฟังก์ชั่นน้อยที่สุดที่ต้องการของ LibGit2 ซึ่งด้านบนจะถูกนำไปใช้ฟังก์ชัน GIT ทั้งหมดที่ต้องการโดย Gitup (โปรดทราบว่า Gitup ใช้ส้อมที่ปรับแต่งเล็กน้อยของ LibGit2)Extensions/
: หมวดหมู่ในคลาส Core
เพื่อเพิ่มคุณสมบัติความสะดวกสบายที่นำมาใช้โดยใช้ API สาธารณะเท่านั้นเลเยอร์ UI (ขึ้นอยู่กับ AppKit และเข้ากันได้กับ OS X เท่านั้น)
Interface/
: คลาสมุมมองระดับต่ำเช่น GIGraphView
เพื่อแสดงมุมมองแผนที่ gitupUtilities/
: คลาสยูทิลิตี้อินเตอร์เฟสเช่นคลาสคอนโทรลเลอร์มุมมองคลาส GIViewController
Components/
: ตัวควบคุมมุมมองมุมมองเดียวที่ใช้ซ้ำได้เช่น GIDiffContentsViewController
เพื่อแสดงผลViews/
: Multi-Views Views ระดับสูงที่นำกลับมาใช้ใหม่ได้เช่น GIAdvancedCommitViewController
เพื่อใช้งาน Gitup Advanced View ทั้งหมด สำคัญ : หาก DEBUG
คงที่ของตัวประมวลผลล่วงหน้าถูกกำหนดเป็นค่าที่ไม่เป็นศูนย์เมื่อสร้าง gitupkit (นี่เป็นค่าเริ่มต้นเมื่อสร้างในการกำหนดค่า "ดีบั๊ก") การตรวจสอบความสอดคล้องพิเศษจำนวนมากจะเปิดใช้งานในเวลาทำงานและการบันทึกเพิ่มเติม โปรดทราบว่าค่าโสหุ้ยนี้สามารถส่งผลกระทบอย่างมีนัยสำคัญ
การใช้ Gitupkit API ควรจะค่อนข้างตรงไปตรงมาเนื่องจากมีการจัดระเบียบโดยฟังก์ชันการทำงาน (เช่นที่เก็บข้อมูลสาขาการดำเนินการส่วนประกอบอินเตอร์เฟส ฯลฯ ... ) และความพยายามที่ดีที่สุดได้ทำเพื่อตั้งชื่อฟังก์ชั่นอย่างชัดเจน
เกี่ยวกับ APIs "Core" วิธีที่ดีที่สุดในการเรียนรู้คือการอ่านการทดสอบหน่วยที่เกี่ยวข้อง - ตัวอย่างเช่นดูการทดสอบสาขาสำหรับ API สาขา
นี่คือรหัสตัวอย่างบางส่วนเพื่อให้คุณเริ่มต้น (การจัดการข้อผิดพลาดถูกทิ้งไว้เป็นแบบฝึกหัดของผู้อ่าน):
การเปิดและเรียกดูที่เก็บ:
// 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 เป็นแอพพื้นฐานที่แจ้งให้ผู้ใช้ repo และแสดงรายการแบบโต้ตอบและการอัปเดตสดของการซ่อน (ทั้งหมดที่มีรหัส ~ 20 บรรทัดใน -[AppDelegate applicationDidFinishLaunching:]
)::
ผ่าน Gitupkit แอพพื้นฐานนี้ยังได้รับการปลดปล่อย/redo แบบไม่ จำกัด , Unified และ Diffs แบบเคียงข้างกัน, การเลือกข้อความและการคัดลอก, แป้นพิมพ์ลัด ฯลฯ ...
ซอร์สโค้ดนี้ยังแสดงให้เห็นถึงวิธีการใช้ตัวควบคุมมุมมอง Gitupkit อื่น ๆ เช่นเดียวกับการสร้างแบบกำหนดเอง
Gitdiff สาธิตวิธีการสร้างคอนโทรลเลอร์มุมมองที่แสดงการอัปเดตแบบสดระหว่าง HEAD
กับ Workdir à la git diff HEAD
:
Gity เป็นโคลน GITX ที่สร้างขึ้นโดยใช้ Gitupkit และรหัสน้อยกว่า 200 บรรทัด:
IGIT เป็นแอพทดสอบ iOS ที่ใช้ Gitupkit เพื่อโคลน GitHub Repo และดำเนินการ
ดูการสนับสนุน.
นอกจากนี้ยังขอขอบคุณผู้สนับสนุน Libgit2 ที่ดีโดยที่ Gitup จะไม่เคยมีอยู่!
Gitup เป็นลิขสิทธิ์ 2015-2018 Pierre-Olivier Latour และพร้อมใช้งานภายใต้ใบอนุญาต GPL V3 ดูไฟล์ใบอนุญาตในโครงการสำหรับข้อมูลเพิ่มเติม
สำคัญ: Gitup รวมโครงการโอเพนซอร์ซอื่น ๆ และโครงการดังกล่าวยังคงอยู่ภายใต้ใบอนุญาตของตนเอง