Travaillez rapidement, en toute sécurité et sans maux de tête. L'interface git qui vous manque toute votre vie est enfin arrivée.
Git a récemment célébré son 10e anniversaire, mais la plupart des ingénieurs sont toujours confus par sa complexité (3 des 5 principales questions de tous les temps sur Stack Overflow sont liées à Git). Étant donné que Git transforme même des actions simples en commandes mystifiantes («Git Add» à la scène par rapport à la «tête de réinitialisation Git» pour déconcerter qui que Frousser leur repo!
Gitup est un pari pour inventer un nouveau modèle d'interaction GIT qui permet aux ingénieurs de tous niveaux de travailler rapidement, en toute sécurité et sans maux de tête. Il est différent de tout autre client GIT à partir de la façon dont il est construit (il interagit directement avec la base de données GIT sur le disque), à la façon dont il fonctionne (vous manipulez le graphique du référentiel au lieu de manipuler les commits).
Avec Gitup, vous obtenez un client GIT vraiment efficace pour Mac:
Gitup a été créé par @swisspol fin 2014 comme un pari pour réinventer la façon dont les développeurs interagissent avec Git. Après plusieurs mois de travail, il a été mis à disposition en pré-sortie début 2015 et a atteint le sommet des actualités des pirates tout en étant présenté par Product Hunt et Daring Fireball. 30 000 lignes de code plus tard, Gitup a atteint 1,0 à la mi-août 2015 et a été publié open source en cadeau à la communauté des développeurs.
brew install homebrew/cask/gitup
(Remarque: Il existe déjà une formule appelée Gitup, donc le nom complet doit être spécifié!)Lisez les documents et utilisez des problèmes GitHub pour le support et les commentaires.
Les notes de versions sont disponibles sur https://github.com/git-zt/gitup/releases. Les constructions marquées avec un v
(par exemple v1.2.3
) sont libérées sur le canal "stable", tandis que les builds tagués avec un b
(par exemple b1234
) ne sont libérés que sur le canal "continu". Vous pouvez modifier le canal de mise à jour utilisé par Gitup dans les préférences de l'application.
Pour construire Gitup vous-même, exécutez simplement la commande git clone --recursive https://github.com/git-up/GitUp.git
dans le terminal, puis ouvrez le projet Xcode GitUp/GitUp.xcodeproj
et le succès.
IMPORTANT: Si vous n'avez pas d'identifiant Apple avec un compte de développeur pour la signature des applications Mac, la version échouera avec une erreur de signature de code. Supprimez simplement le paramètre de construction "Code Signing Identity" de la cible "Application" pour contourner le problème:
Alternativement , si vous disposez d'un compte développeur, vous pouvez créer le fichier "xcode-configurations / development_team.xcconfig" avec le paramètre de génération suivant comme contenu:
Development_Team = [Votre TeamID]
Pour une description plus détaillée de cela, vous pouvez consulter les commentaires à la fin du fichier "Xcode-Configurations / Base.xcConfig".
Gitup est construit comme une couche mince au-dessus d'une boîte à outils Git générique réutilisable appelée "gitupkit". Cela signifie que vous pouvez utiliser ce même framework Gitupkit pour construire votre propre interface utilisateur GIT!
Gitupkit a un objectif très différent de ObjectiveGit. Au lieu d'offrir des liaisons brutes étendues à LibGit2, Gitupkit utilise uniquement un sous-ensemble minimal de LibGit2 et réimplique tout le reste en plus (il a son propre "moteur de rébase" par exemple). Cela lui permet d'exposer une API très serrée et cohérente, qui suit complètement les conventions OBJ-C et masque la complexité Libgit2 et parfois les incohérences. Gitupkit ajoute au-dessus de ce nombre de fonctionnalités exclusives et puissantes, de Machine UNDO / Redo et Time Machine comme des instantanés, aux composants entiers de l'interface utilisateur.
Le code source de Gitupkit est organisé comme 2 couches indépendantes communiquant uniquement par l'utilisation d'API publiques:
Couche de base (dépend uniquement de la fondation et est compatible avec OS X et iOS)
Core/
: Wrapper autour de la fonctionnalité minimale requise de LibGit2, en plus de laquelle est ensuite implémenté toutes les fonctionnalités Git requises par Gitup (notez que Gitup utilise une fourche légèrement personnalisée de Libgit2)Extensions/
: Catégories sur les classes Core
pour ajouter des fonctionnalités de commodité implémentées uniquement en utilisant les API publiquesCouche d'interface utilisateur (dépend de l'appkit et est compatible avec OS X uniquement)
Interface/
: Classes de vue de bas niveau, par exemple GIGraphView
pour rendre la vue de la carte GitupUtilities/
: Classes d'utilité d'interface par exemple la classe de base de la vue de base GIViewController
Components/
: Contrôleurs de vue unique réutilisables, par exemple, GIDiffContentsViewController
pour rendre un diffViews/
: Contrôleurs de vue multi-vues réutilisables de haut niveau, par exemple, GIAdvancedCommitViewController
pour implémenter la vue d'ensemble de la gitup avancée Gitup Important : Si le DEBUG
constant du préprocesseur est défini à une valeur non nulle lors de la création de Gitupkit (c'est la valeur par défaut lors de la construction dans la configuration "de débogage"), un certain nombre de vérifications de cohérence supplémentaires sont activées au moment de l'exécution ainsi que la journalisation supplémentaire. Sachez que ces frais généraux peuvent affecter considérablement les performances.
L'utilisation de l'API Gitupkit doit être assez simple car elle est organisée par la fonctionnalité (par exemple, le référentiel, les branches, les validations, les composants d'interface, etc ...) et un meilleur effort a été fait pour nommer clairement les fonctions.
En ce qui concerne les API "Core", la meilleure façon de les apprendre est de parcourir les tests unitaires associés - par exemple, voir les tests de branche pour l'API de branche.
Voici un exemple de code pour vous lancer (la gestion des erreurs est laissée comme un exercice au lecteur):
Ouverture et naviguer dans un référentiel:
// 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);
Modification d'un référentiel:
// 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 est une application très basique qui invite l'utilisateur à un dépôt et affiche une liste interactive et live-updating de ses bases (toutes avec ~ 20 lignes de code dans -[AppDelegate applicationDidFinishLaunching:]
):
Grâce à Gitupkit, cette application de base obtient également gratuitement des difficultés et de rétrofacturation, des difficultés et de la copie, des raccourcis clavier unifiés et côte à côte, la sélection et la copie des textes, les raccourcis clavier, etc ...
Ce code source montre également comment utiliser d'autres contrôleurs Gitupkit View ainsi que la création de celui personnalisé.
Gitdiff montre comment créer un contrôleur de vue qui affiche un Diff de mise à jour en direct entre HEAD
et la git diff HEAD
:
Gity est un clone Gitx construit à l'aide de Gitupkit et moins de 200 lignes de code:
IGIT est une application iOS de test qui utilise simplement Gitupkit pour cloner un repo GitHub et effectuer un engagement.
Voir contribution.md.
Un grand merci également aux beaux contributeurs libgit2 sans qui Gitup n'aurait jamais existé!
Gitup est Copyright 2015-2018 Pierre-Olivier Latour et disponible sous licence GPL V3. Voir le fichier de licence dans le projet pour plus d'informations.
Important: Gitup comprend certains autres projets open-source et ces projets restent sous leur propre licence.