Arbeiten Sie schnell, sicher und ohne Kopfschmerzen. Die Git -Oberfläche, die Ihnen Ihr ganzes Leben lang vermisst hat, ist endlich angekommen.
Git hat kürzlich sein 10 -jähriges Jubiläum gefeiert, aber die meisten Ingenieure sind immer noch durch seine Komplexität verwirrt (3 der 5 Top -5 -Fragen aller Zeiten beim Stapelüberlauf sind Gits bezogen). Da Git auch einfache Aktionen in mystifizierende Befehle verwandelt („Git add“ in die Bühne versus „Git Reset Head“, um jemanden zu lösen?), Kein Überraschung, verschwenden die Benutzer Zeit, frustriert zu werden, den Rest ihres Teams um Hilfe abzulenken oder schlimmer. Verdrehen Sie ihr Repo!
Gitup ist eine Wette, um ein neues Git -Interaktionsmodell zu erfinden, mit dem Ingenieure aller Ebenen schnell, sicher und ohne Kopfschmerzen arbeiten können. Es ist anders als jeder andere Git -Client da draußen, von der Art und Weise, wie er erstellt wurde (es interagiert direkt mit der Git -Datenbank auf der Festplatte), bis hin zu der Art und Weise, wie es funktioniert (Sie manipulieren das Repository -Diagramm, anstatt Commits zu manipulieren).
Mit Gitup erhalten Sie einen wirklich effizienten Git -Client für Mac:
Gitup wurde Ende 2014 von @Swisspol als Wette zur Neuerfinden der Art und Weise, wie Entwickler mit Git interagieren, neu erfinden. Nach mehreren Monaten der Arbeit wurde es Anfang 2015 in der Vorveröffentlichung zur Verfügung gestellt und erreichte die Spitze der Hacker News sowie von Product Hunt und Maging Fireball. 30.000 Code-Zeilen später erreichte Gitup Mitte August 2015 1,0 und wurde Open Source als Geschenk an die Entwicklergemeinschaft veröffentlicht.
brew install homebrew/cask/gitup
(Hinweis: Es gibt bereits eine Formel namens Gitup, daher muss der vollständige Name angegeben werden!)Lesen Sie die Dokumente und verwenden Sie GitHub -Probleme für Unterstützung und Feedback.
Veröffentlichungsnotizen finden Sie unter https://github.com/gitup/gitup/releases. Mit einem v
(z. B. v1.2.3
) markierte Builds werden auf dem "stabilen" Kanal veröffentlicht, während Builds mit einem b
(z. B. b1234
) nur auf dem "kontinuierlichen" Kanal veröffentlicht werden. Sie können den von Gitup in den App -Einstellungen verwendeten Aktualisierungskanal ändern.
Um Gitup selbst zu erstellen, führen Sie einfach den Befehl git clone --recursive https://github.com/git-up/GitUp.git
im Terminal, und öffnen Sie dann das Projekt GitUp/GitUp.xcodeproj
xcode und run.
WICHTIG: Wenn Sie keine Apple -ID mit einem Entwicklerkonto für Mac -Apps für Codesignierungen haben, fehlschlägt der Build mit einem Code -Signierfehler. Löschen Sie einfach die Erstellung der Erstellung des "Anwendungs" -Ziels "Code Signing Identity", um das Problem zu umgehen:
Wenn Sie über ein Entwicklerkonto verfügen, können Sie die Datei "Xcode-Configurations/Development_team.xcconfig" mit der folgenden Build-Einstellung als Inhalt erstellen:
Development_team = [Ihre Teamid]
Für eine detailliertere Beschreibung können Sie sich die Kommentare am Ende der Datei "Xcode-Configurations/Base.xcconfig" ansehen.
Gitup ist als dünne Schicht auf einem wiederverwendbaren generischen Git -Toolkit namens "Gitupkit" gebaut. Dies bedeutet, dass Sie dasselbe Gitupkit -Framework verwenden können, um Ihre eigene GIT -Benutzeroberfläche zu erstellen!
Gitupkit hat ein ganz anderes Ziel als objektivgit. Gitupkit verwendet nur eine minimale Untergruppe von libgit2 und neu auf alles andere über sie (sie hat beispielsweise eine eigene "Rebase -Engine"). Dies ermöglicht es ihm, eine sehr enge und konsistente API aufzudecken, die den OBJ-C-Konventionen vollständig folgt und die Libgit2-Komplexität und manchmal in Unstimmigkeiten versteckt. Gitupkit fügt darüber hinaus eine Reihe exklusiver und leistungsstarker Funktionen hinzu, von Rückgängigmacher und Zeitmaschinen wie Schnappschüssen bis hin zu gesamten Drop-In-UI-Komponenten.
Der Gitupkit -Quellcode ist als zwei unabhängige Ebenen organisiert, die nur durch die Verwendung öffentlicher APIs kommunizieren:
Basisschicht (hängt nur von der Fundament ab und ist mit OS X und iOS kompatibel)
Core/
: Wrapper um die erforderliche minimale Funktionalität von libgit2, auf der dann alle von Gitup erforderlichen GIT -Funktionen implementiert werden (beachten Sie, dass Gitup eine leicht angepasste Gabel von libgit2 verwendet)Extensions/
: Kategorien in den Core
, um Komfortfunktionen hinzuzufügen, die nur mit den öffentlichen APIs implementiert sindUI -Schicht (abhängig von AppKit und ist nur mit OS X kompatibel)
Interface/
: Low-Level-Ansichtsklassen, GIGraphView
.Utilities/
: Schnittstellen -Dienstprogrammklassen, z. B. die Basisansicht Controller -Klasse GIViewController
Components/
: Wiederverwendbare Einzelansicht-Ansicht Controller z GIDiffContentsViewController
Views/
: hochrangige wiederverwendbare Multi-Views-Ansichts-Controller z GIAdvancedCommitViewController
Wichtig : Wenn das konstante Präprozessor DEBUG
beim Erstellen von Gitupkit mit einem Wert ungleich Null definiert ist (dies ist die Standardeinstellung beim Erstellen in der Konfiguration von "Debugg"), werden eine Reihe zusätzlicher Konsistenzprüfungen zur Laufzeit sowie zusätzliche Protokollierung aktiviert. Beachten Sie, dass dieser Overhead die Leistung erheblich beeinflussen kann.
Die Verwendung der Gitupkit -API sollte ziemlich einfach sein, da sie nach Funktionen organisiert ist (z. B. Repository, Zweige, Commits, Schnittstellenkomponenten usw.), und es wurde ein bester Aufwand unternommen, um Funktionen klar zu nennen.
In Bezug auf die "Kern" -APIs ist der beste Weg, um sie zu lernen, die zugehörigen Unit -Tests zu lesen - beispielsweise sehen Sie sich die Zweig -Tests für die AST -API an.
Hier ist ein Beispielcode, mit dem Sie beginnen können (Fehlerbehandlung bleibt als Übung für den Leser):
Öffnen und Durchsuchen eines Repositorys:
// 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);
Ändern eines Repositorys:
// 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 ist eine sehr grundlegende App, die den Benutzer für ein Repo auffordert und eine interaktive und live -updatierende Liste seiner Vorräte anzeigt (alle mit ~ 20 Codezeilen in -[AppDelegate applicationDidFinishLaunching:]
):
Durch Gitupkit erhält diese grundlegende App auch für kostenlose unbegrenzte Rückgänge/Wiederherstellung, einheitliche und nebenseitige Diffs, Textauswahl und Kopie, Tastaturverknüpfungen usw.
Dieser Quellcode zeigt auch, wie einige andere Gitupkit -Ansichtscontroller verwendet werden und eine angepasste erstellt werden.
Gitdiff zeigt, wie man einen Ansichts -Controller erstellt, der einen Live -Aktualisierungsdiff zwischen HEAD
und dem Workdir à la git diff HEAD
zeigt:
Gity ist ein Gitx -Klon, der mit Gitupkit und weniger als 200 Codezeilen erstellt wurde:
IGIT ist eine Test -iOS -App, die einfach Gitupkit verwendet, um ein Github -Repo zu klonen und ein Commit durchzuführen.
Siehe Beitrag.md.
Auch ein großer Dank an die feinen Libgit2 -Mitwirkenden, ohne die Gitup nie existiert hätte!
Gitup ist Copyright 2015-2018 Pierre-Olivier Latour und erhältlich unter der GPL V3-Lizenz. Weitere Informationen finden Sie in der Lizenzdatei im Projekt.
Wichtig: Gitup enthält einige andere Open-Source-Projekte und solche Projekte bleiben unter ihrer eigenen Lizenz.