Bekerja dengan cepat, aman, dan tanpa sakit kepala. Antarmuka git yang Anda lewatkan sepanjang hidup Anda akhirnya tiba.
Git baru -baru ini merayakan ulang tahun 10 tahun, tetapi sebagian besar insinyur masih bingung dengan kerumitannya (3 dari 5 pertanyaan teratas sepanjang masa di Stack Overflow terkait dengan Git). Karena Git mengubah bahkan tindakan sederhana menjadi perintah yang membingungkan ("git add" ke panggung versus "git reset head" untuk melepaskan siapa pun?), Tidak mengherankan pengguna membuang waktu, menjadi frustrasi, mengalihkan perhatian tim mereka untuk meminta bantuan, atau lebih buruk, atau lebih buruk lagi, atau lebih buruk Persetan repo mereka!
Gitup adalah taruhan untuk menciptakan model interaksi GIT baru yang memungkinkan para insinyur dari semua level bekerja dengan cepat, aman, dan tanpa sakit kepala. Tidak seperti klien git lain di luar sana dari cara dibangun (berinteraksi langsung dengan database Git pada disk), dengan cara kerjanya (Anda memanipulasi grafik repositori alih -alih memanipulasi komitmen).
Dengan Gitup, Anda mendapatkan klien git yang benar -benar efisien untuk Mac:
Gitup dibuat oleh @swisspol pada akhir 2014 sebagai taruhan untuk menemukan kembali cara pengembang berinteraksi dengan GIT. Setelah beberapa bulan bekerja, itu tersedia di pra-rilis awal 2015 dan mencapai puncak Hacker News bersama dengan ditampilkan oleh Product Hunt dan Daring Fireball. 30.000 baris kode kemudian, Gitup mencapai 1,0 pertengahan Agustus 2015 dan dirilis open source sebagai hadiah untuk komunitas pengembang.
brew install homebrew/cask/gitup
(Catatan: sudah ada formula yang disebut gitup, jadi nama lengkapnya harus ditentukan!)Baca dokumen dan gunakan masalah GitHub untuk dukungan & umpan balik.
Catatan rilis tersedia di https://github.com/git-up/gitup/releases. Builds Ditandai dengan v
(misalnya v1.2.3
) dirilis pada saluran "stabil", sementara build yang ditandai dengan b
(misalnya b1234
) hanya dirilis pada saluran "kontinu". Anda dapat mengubah saluran pembaruan yang digunakan oleh Gitup di preferensi aplikasi.
Untuk membangun gitup sendiri, cukup jalankan command git clone --recursive https://github.com/git-up/GitUp.git
di terminal, lalu buka proyek GitUp/GitUp.xcodeproj
xcode dan tekan run.
PENTING: Jika Anda tidak memiliki ID Apple dengan akun pengembang untuk aplikasi Mac penandatanganan kode, build akan gagal dengan kesalahan penandatanganan kode. Cukup hapus pengaturan build "Code Signing Identity" dari target "aplikasi" untuk mengatasi masalah ini:
Atau , jika Anda memiliki akun pengembang, Anda dapat membuat file "Xcode-Configurations/development_team.xcconfig" dengan pengaturan build berikut sebagai kontennya:
Development_team = [TeamID Anda]
Untuk deskripsi yang lebih rinci tentang ini, Anda dapat melihat komentar di akhir file "Xcode-Configurations/Base.xcconfig".
Gitup dibangun sebagai lapisan tipis di atas toolkit Git generik yang dapat digunakan kembali yang disebut "gitupkit". Ini berarti Anda dapat menggunakan kerangka kerja gitupkit yang sama untuk membangun git UI Anda sendiri!
Gitupkit memiliki tujuan yang sangat berbeda dari ObjectiveGit. Alih -alih menawarkan binding mentah yang luas ke libgit2, Gitupkit hanya menggunakan subset minimal dari libgit2 dan mengimplementasikan semua yang lain di atasnya (ia memiliki "mesin rebase" sendiri misalnya). Ini memungkinkannya untuk mengekspos API yang sangat ketat dan konsisten, yang sepenuhnya mengikuti konvensi OBJ-C dan menyembunyikan kompleksitas libgit2 dan kadang-kadang ketidakkonsistenan. Gitupkit menambahkan di atas itu sejumlah fitur eksklusif dan kuat, dari undo/redo dan time machine seperti snapshot, ke seluruh komponen UI drop-in.
Kode Sumber Gitupkit diatur sebagai 2 lapisan independen yang hanya berkomunikasi melalui penggunaan API publik:
Lapisan dasar (hanya tergantung pada fondasi dan kompatibel dengan OS X dan iOS)
Core/
: Pembungkus di sekitar fungsi minimal yang diperlukan dari libgit2, di atasnya kemudian diimplementasikan semua fungsi git yang diperlukan oleh gitup (perhatikan bahwa gitup menggunakan garpu libgit2 yang sedikit disesuaikan)Extensions/
: Kategori pada kelas Core
untuk menambahkan fitur kenyamanan yang hanya diimplementasikan menggunakan API publikLapisan UI (tergantung pada appkit dan kompatibel dengan OS X saja)
Interface/
: Kelas Tampilan Tingkat Rendah Misalnya GIGraphView
untuk membuat tampilan peta gitupUtilities/
: Kelas Utilitas Antarmuka misalnya Kelas Pengontrol Tampilan Dasar GIViewController
Components/
: pengontrol tampilan tampilan tunggal yang dapat digunakan kembali misalnya GIDiffContentsViewController
untuk membuat berbedaViews/
: Pengendali View View yang Dapat Digunakan Kembali Level Tinggi EG GIAdvancedCommitViewController
untuk mengimplementasikan seluruh tampilan komit lanjut Gitup PENTING : Jika preprocessor DEBUG
konstan didefinisikan untuk nilai bukan nol saat membangun gitupkit (ini adalah default saat membangun dalam konfigurasi "debug"), sejumlah pemeriksaan konsistensi tambahan diaktifkan pada waktu berjalan serta pencatatan tambahan. Ketahuilah bahwa overhead ini dapat secara signifikan mempengaruhi kinerja.
Menggunakan API GitUpkit harus cukup mudah karena diatur oleh fungsionalitas (misalnya repositori, cabang, komitmen, komponen antarmuka, dll ...) dan upaya terbaik telah dilakukan untuk nama fungsi dengan jelas.
Mengenai API "inti", cara terbaik untuk mempelajarinya adalah dengan membaca tes unit terkait - misalnya melihat tes cabang untuk API cabang.
Berikut adalah beberapa kode sampel untuk Anda mulai (penanganan kesalahan dibiarkan sebagai latihan untuk pembaca):
Membuka dan menjelajahi repositori:
// 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);
Memodifikasi repositori:
// 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 adalah aplikasi yang sangat mendasar yang meminta pengguna untuk repo dan menampilkan daftar simpanan interaktif dan live -updating (semua dengan ~ 20 baris kode di -[AppDelegate applicationDidFinishLaunching:]
):
Melalui GitUpkit, aplikasi dasar ini juga mendapat diffs off-by-side, pilihan dan salinan teks yang tidak terbatas, unified dan berdampingan, pemilihan teks dan salinan, pintasan keyboard, dll ...
Kode sumber ini juga menunjukkan cara menggunakan beberapa pengontrol tampilan GitUpkit lainnya serta membangun yang disesuaikan.
Gitdiff menunjukkan cara membuat pengontrol tampilan yang menampilkan perbedaan pembaruan langsung antara HEAD
dan workdir à la git diff HEAD
:
Gity adalah klon GITX yang dibangun menggunakan Gitupkit dan kurang dari 200 baris kode:
IGIT adalah aplikasi tes iOS yang hanya menggunakan gitupkit untuk mengkloning repo github dan melakukan komit.
Lihat Contributing.md.
Juga terima kasih banyak kepada kontributor Libgit2 yang baik tanpanya Gitup tidak akan pernah ada!
Gitup adalah Hak Cipta 2015-2018 Pierre-Olivier Latour dan tersedia di bawah lisensi GPL V3. Lihat file lisensi dalam proyek untuk informasi lebih lanjut.
Penting: Gitup mencakup beberapa proyek open-source lainnya dan proyek tersebut tetap di bawah lisensi mereka sendiri.