Trabalhe rapidamente, com segurança e sem dores de cabeça. A interface Git que você perdeu toda a sua vida finalmente chegou.
O Git comemorou recentemente seu aniversário de 10 anos, mas a maioria dos engenheiros ainda está confusa com sua complexidade (3 das 5 principais questões de todos os tempos no transbordamento da pilha estão relacionados ao Git). Como o Git transforma ações simples em comandos misterificantes ("git add" ao palco versus "git reiniciar a cabeça" para soltar alguém?), Não é de surpreender que os usuários perdem tempo, fiquem frustrados, distraem o resto de sua equipe por ajuda, ou pior, Enfrente o repositório deles!
O GITUP é uma aposta para inventar um novo modelo de interação Git que permite que os engenheiros de todos os níveis funcionem de maneira rápida, segura e sem dores de cabeça. É diferente de qualquer outro cliente Git da maneira como é construída (ele interage diretamente com o banco de dados Git no disco), com a maneira como ele funciona (você manipula o gráfico do repositório em vez de manipular compromissos).
Com o GITUP, você obtém um cliente Git verdadeiramente eficiente para Mac:
O GITUP foi criado pelo @SwissPol no final de 2014 como uma aposta para reinventar a maneira como os desenvolvedores interagem com o Git. Após vários meses de trabalho, foi disponibilizado no pré-lançamento no início de 2015 e chegou ao topo do Hacker News, além de ser apresentado pela Hunt de Produto e ousada Ball. 30.000 linhas de código mais tarde, Gitup atingiu 1,0 em meados de agosto de 2015 e foi lançado de código aberto como um presente para a comunidade de desenvolvedores.
brew install homebrew/cask/gitup
(Note: There is already a formula called gitup, so the full name must be specified!)Leia os documentos e use problemas do GitHub para suporte e feedback.
As notas de lançamentos estão disponíveis em 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. Você pode alterar o canal de atualização usado pelo GITUP nas preferências do aplicativo.
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. Basta excluir a configuração de construção da "identidade de assinatura de código" do alvo "aplicativo" para contornar o 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:
Development_team = [seu TeamID]
Para uma descrição mais detalhada disso, você pode dar uma olhada nos comentários no final do arquivo "Xcode-Configurações/base.xcconfig".
O GITUP é construído como uma camada fina em cima de um kit de ferramentas genérico reutilizável chamado "gitupkit". Isso significa que você pode usar a mesma estrutura Gitupkit para construir sua própria interface do usuário git!
O Gitupkit tem um objetivo muito diferente do ObjectiveGit. Em vez de oferecer extensas ligações brutas ao libgit2, o GITUPKIT usa apenas um subconjunto mínimo de libgit2 e reimplementa tudo o mais no topo (ele possui seu próprio "mecanismo de rebase", por exemplo). Isso permite expor uma API muito apertada e consistente, que segue completamente as convenções OBJ-C e esconde a complexidade do libgit2 e às vezes inconsistências. O Gitupkit acrescenta um número de recursos exclusivos e poderosos, desde desfazer/refazer e máquina do tempo, como instantâneos, a componentes de interface do usuário.
O código -fonte Gitupkit é organizado como 2 camadas independentes que se comunicam apenas através do uso de APIs públicas:
Camada base (depende apenas da fundação e é compatível com o 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 APIsCamada de interface do usuário (depende do Appkit e é compatível apenas com o OS X)
Interface/
: low-level view classes eg GIGraphView
to render the GitUp Map viewUtilities/
: 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. Esteja ciente de que essa sobrecarga pode afetar significativamente o desempenho.
O uso da API do GITUPKIT deve ser bem direto, pois é organizado por funcionalidade (por exemplo, repositório, ramificações, cometidos, componentes de interface, etc ...) e um melhor esforço foi feito para nomear funções claramente.
Em relação às APIs "núcleos", a melhor maneira de aprendê -las é ler os testes de unidade associados - por exemplo, consulte os testes de ramificação da API da filial.
Aqui está algum código de exemplo para você começar (o manuseio de erros é deixado como um exercício para o leitor):
Abrindo e navegando um repositório:
// 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);
Modificando um repositório:
// 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:]
):
Através do GitUpkit, este aplicativo básico também recebe de graça, desfazer/refazer ilimitado, unificado e lateral a lado, seleção de texto e cópia, atalhos de teclado, etc ...
Esse código -fonte também demonstra como usar outros controladores de exibição do Gitupkit, além de criar um 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 é um clone GITX construído usando Gitupkit e menos de 200 linhas de código:
O iGit é um aplicativo de teste iOS que simplesmente usa o Gitupkit para clonar um repositório do GitHub e executar uma confirmação.
Consulte Contribuindo.md.
Também um grande agradecimento aos finos colaboradores do LibGit2 sem os quais Gitup nunca teria existido!
O GITUP é Copyright 2015-2018 Pierre-Olivier Latour e disponível sob licença GPL V3. Consulte o arquivo de licença no projeto para obter mais informações.
IMPORTANT: GitUp includes some other open-source projects and such projects remain under their own license.