Trabaje rápido, de forma segura y sin dolores de cabeza. La interfaz GIT que te has estado perdiendo toda tu vida finalmente ha llegado.
GIT celebró recientemente su 10 años de aniversario, pero la mayoría de los ingenieros todavía están confundidos por su complejidad (3 de las 5 preguntas principales de todos los tiempos en el desbordamiento de la pila están relacionadas con GIT). Dado que Git convierte incluso acciones simples en comandos desconcertantes ("Git Agregar" al escenario versus "Git Restablecer la cabeza" para que destaque a alguien?), No sorprende que los usuarios pierdan el tiempo, se sientan frustrados, distraen al resto de su equipo en busca de ayuda, o peor, o peor, ¡Ajusta su repositorio!
Gitup es una apuesta para inventar un nuevo modelo de interacción GIT que permite a los ingenieros de todos los niveles trabajar de manera rápida, segura y sin dolores de cabeza. Es diferente a cualquier otro cliente GIT desde la forma en que se construye (interactúa directamente con la base de datos GIT en el disco), hasta la forma en que funciona (manipula el gráfico del repositorio en lugar de manipular las confirmaciones).
Con Gitup, obtienes un cliente GIT verdaderamente eficiente para Mac:
Gitup fue creado por @SwissPol a fines de 2014 como una apuesta para reinventar la forma en que los desarrolladores interactúan con GIT. Después de varios meses de trabajo, se puso a disposición en el prelanzamiento a principios de 2015 y llegó a la cima de Hacker News junto con la presentación de productos Hunt y Daring Fireball. 30,000 líneas de código más tarde, Gitup alcanzó 1.0 a mediados de agosto de 2015 y fue lanzado con código abierto como regalo para la comunidad de desarrolladores.
brew install homebrew/cask/gitup
(Note: There is already a formula called gitup, so the full name must be specified!)Lea los documentos y use problemas de GitHub para obtener soporte y comentarios.
Las notas de lanzamiento están disponibles en https://github.com/git-up/gitup/releases. Builds tagged with a v
(eg v1.2.3
) are released on the "Stable" channel, while builds tagged with a b
(eg b1234
) are only released on the "Continuous" channel. Puede cambiar el canal de actualización utilizado por Gitup en las preferencias de la aplicación.
To build GitUp yourself, simply run the command git clone --recursive https://github.com/git-up/GitUp.git
in Terminal, then open the GitUp/GitUp.xcodeproj
Xcode project and hit Run.
IMPORTANT: If you do not have an Apple ID with a developer account for code signing Mac apps, the build will fail with a code signing error. Simplemente elimine la configuración de compilación "Identidad de firma de código" del objetivo "Aplicación" para trabajar en torno al problema:
Alternatively , if you do have a developer account, you can create the file "Xcode-Configurations/DEVELOPMENT_TEAM.xcconfig" with the following build setting as its content:
Desarrollo_team = [tu teamID]
Para una descripción más detallada de esto, puede echar un vistazo a los comentarios al final del archivo "Xcode-Configurations/Base.xcconfig".
Gitup se construye como una capa delgada encima de un kit de herramientas Git genérico reutilizable llamado "Gitupkit". ¡Esto significa que puede usar ese mismo marco Gitupkit para construir su propia interfaz de usuario de Git!
Gitupkit tiene un objetivo muy diferente al ObjectiveGit. En lugar de ofrecer ataduras en bruto extensas a libgit2, Gitupkit solo usa un subconjunto mínimo de libgit2 y reimplomea todo lo demás (por ejemplo, tiene su propio "motor Rebase"). Esto le permite exponer una API muy apretada y consistente, que sigue por completo las convenciones OBJ-C y esconde la complejidad de Libgit2 y, a veces, inconsistencias. Gitupkit se suma además de una serie de características exclusivas y poderosas, desde deshacer/rehacer y máquina de tiempo como instantáneas, hasta componentes de interfaz de usuario enteros.
El código fuente de Gitupkit se organiza como 2 capas independientes que se comunican solo mediante el uso de API públicas:
Capa base (depende solo de la base y es compatible con OS X e iOS)
Core/
: wrapper around the required minimal functionality of libgit2, on top of which is then implemented all the Git functionality required by GitUp (note that GitUp uses a slightly customized fork of libgit2)Extensions/
: categories on the Core
classes to add convenience features implemented only using the public APIsCapa de UI (depende de AppKit y es compatible solo con OS X)
Interface/
: clases de vista de bajo nivel, por ejemplo, GIGraphView
para representar la vista del mapa de GitupUtilities/
: interface utility classes eg the base view controller class GIViewController
Components/
: reusable single-view view controllers eg GIDiffContentsViewController
to render a diffViews/
: high-level reusable multi-views view controllers eg GIAdvancedCommitViewController
to implement the entire GitUp Advanced Commit view IMPORTANT : If the preprocessor constant DEBUG
is defined to a non-zero value when building GitUpKit (this is the default when building in "Debug" configuration), a number of extra consistency checks are enabled at run time as well as extra logging. Tenga en cuenta que esta sobrecarga puede afectar significativamente el rendimiento.
El uso de la API de Gitupkit debe ser bastante sencilla, ya que está organizado por funcionalidad (por ejemplo, repositorio, ramas, comodidades, componentes de interfaz, etc.) y se ha hecho un mejor esfuerzo para nombrar funciones claramente.
Con respecto a las API del "núcleo", la mejor manera de aprenderlas es examinar las pruebas unitarias asociadas, por ejemplo, consulte las pruebas de rama para la API de la rama.
Aquí hay algún código de muestra para comenzar (el manejo de errores se deja como un ejercicio para el lector):
Abrir y navegar por un repositorio:
// 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);
Modificación de un repositorio:
// 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 is a very basic app that prompts the user for a repo and displays an interactive and live-updating list of its stashes (all with ~20 lines of code in -[AppDelegate applicationDidFinishLaunching:]
):
A través de GitUpkit, esta aplicación básica también obtiene desactivación/rehacer ilimitado gratuita, diferencias unificadas y de lado a lado, selección y copia de texto, atajos de teclado, etc.
Este código fuente también demuestra cómo usar otros controladores de vista Gitupkit, así como construir uno personalizado.
GitDiff demonstrates how to create a view controller that displays a live updating diff between HEAD
and the workdir à la git diff HEAD
:
Gity es un clon Gitx construido con Gitupkit y menos de 200 líneas de código:
IGIT es una aplicación Test iOS que simplemente usa Gitupkit para clonar un repositorio de GitHub y realizar una confirmación.
Ver contribuyente. MD.
¡También un gran agradecimiento a los contribuyentes de Fine Libgit2 sin los cuales Gitup nunca hubiera existido!
Gitup es Copyright 2015-2018 Pierre-Olivier Latour y disponible bajo la licencia GPL V3. Consulte el archivo de licencia en el proyecto para obtener más información.
IMPORTANT: GitUp includes some other open-source projects and such projects remain under their own license.