Работайте быстро, безопасно и без головной боли. Интерфейс GIT, который вы упустили всю свою жизнь, наконец -то прибыл.
GIT недавно отпраздновал свой 10 -летний юбилей, но большинство инженеров по -прежнему смущаются его запутанностью (3 из 5 лучших вопросов всех времен в переполнении стека связаны с GIT). Поскольку GIT превращает даже простые действия в загадочные команды («git add» на сцену против «GIT Reset Head», чтобы неустановить кого -либо?), Неудивительно, что пользователи тратят время, разочаровываются, отвлекают остальную часть своей команды или, что еще хуже, Закрутите их репо!
Gitup - это ставка, чтобы изобретать новую модель взаимодействия GIT, которая позволяет инженерам всех уровней работать быстро, безопасно и без головной боли. Он не похож на любого другого клиента GIT, от того, как он построен (он напрямую взаимодействует с базой данных GIT на диске), до того, как он работает (вы манипулируете графом репозитория вместо манипулирования коммитами).
С Gitup вы получаете действительно эффективный клиент GIT для Mac:
Gitup был создан @swisspol в конце 2014 года в качестве ставки, чтобы переосмыслить способ взаимодействия разработчиков с GIT. После нескольких месяцев работы он был предоставлен в предварительном выпуске в начале 2015 года и достиг вершины Hacker News, а также был представлен охотой на продукты и дерзкий огненный шар. 30 000 строк кода позже, Gitup достиг 1,0 в середине августа 2015 года и был выпущен с открытым исходным кодом в качестве подарка сообществу разработчиков.
brew install homebrew/cask/gitup
(примечание: уже есть формула, называемая Gitup, поэтому полное имя должно быть указано!)Прочитайте документы и используйте проблемы GitHub для поддержки и обратной связи.
Заметки выпуска доступны по адресу https://github.com/git-up/gitup/releases. Сборки с меткой v
(например, v1.2.3
) выпускаются на канале «стабильный», в то время как сборки, помеченные b
(например, b1234
), выпускаются только на «непрерывном» канале. Вы можете изменить канал обновления, используемый GITUP в предпочтениях приложения.
Чтобы построить Gitup самостоятельно, просто запустите команду git clone --recursive https://github.com/git-up/GitUp.git
в терминале, затем откройте проект GitUp/GitUp.xcodeproj
xcode и нажимайте.
ВАЖНО: Если у вас нет идентификатора Apple с учетной записью разработчика для приложений Mac, подписываемого кода, сборка потерпит неудачу с ошибкой подписания кода. Просто удалите настройку сборки «Идентификация подписания кода» целевого «Приложения» для оборудования для этой проблемы:
В качестве альтернативы , если у вас есть учетная запись разработчика, вы можете создать файл «Xcode-Configurations/development_team.xcconfig» со следующим настройкой сборки в качестве его содержимого:
Development_team = [your teamid]
Для более подробного описания этого вы можете взглянуть на комментарии в конце файла "Xcode-Configurations/base.xcconfig".
Gitup построен как тонкий слой поверх многоразового общего инструментария GIT под названием «gitupkit». Это означает, что вы можете использовать ту же самую рамку Gitupkit, чтобы создать свой собственный интерфейс GIT!
Gitupkit имеет совершенно иную цель, чем ObjectiveGit. Вместо того, чтобы предлагать обширные необработанные привязки для Libgit2, Gitupkit использует только минимальное подмножество Libgit2 и переосмысляет все остальное поверх него (например, у него свой «Rebase Engine»). Это позволяет ему разоблачить очень плотный и последовательный API, который полностью следует за соглашениями OBJ-C и скрывает сложность Libgit2 и иногда несоответствия. Gitupkit добавляет к этому ряд эксклюзивных и мощных функций, от Undo/Redo и Time Machine, таких как снимки, до целых компонентов пользовательского интерфейса.
Исходный код Gitupkit организован как 2 независимых уровня, общающихся только за счет использования публичных API:
Базовый слой (зависит только от фундамента и совместим с OS X и iOS)
Core/
: обертка вокруг требуемой минимальной функциональности Libgit2, поверх которой затем реализуется все функциональность GIT, необходимые Gitup (обратите внимание, что Gitup использует слегка настроенную вилку Libgit2)Extensions/
: Категории на Core
классах, чтобы добавить удобные функции, реализованные только с использованием публичных APIУровень пользовательского интерфейса (зависит от Appkit и совместим только с OS X)
Interface/
: классы просмотра низкого уровня, например, GIGraphView
чтобы отобразить представление карты GITUPUtilities/
: классы утилиты интерфейса, например, класс контроллера базового представления GIViewController
Components/
: повторно используемые контроллеры представления с одним видом, например, GIDiffContentsViewController
, чтобы отобразитьViews/
: Постоянные многопрофильные контроллеры представлений, например, в многоуровневом представлении, например, GIAdvancedCommitViewController
для реализации всего просмотра расширенного коммита GITUP ВАЖНО : Если при создании Gitupkit определяется постоянная DEBUG
препроцессора (это нелезовое значение (это по умолчанию при строительстве в конфигурации «отладки»), ряд дополнительных проверок согласованности включается во время выполнения, а также в дополнительном журнале. Имейте в виду, что эти накладные расходы могут значительно повлиять на производительность.
Использование API Gitupkit должно быть довольно простым, поскольку он организован по функциональности (например, хранилище, ветви, коммиты, компоненты интерфейса и т. Д.) И были предприняты наилучшие усилия, чтобы четко назвать функции.
Что касается «основных» API, лучшего способа их изучения - это просмотреть соответствующие модульные тесты - например, просмотреть тесты ветвления для API филиала.
Вот какой -то пример кода, который вы запустите (обработка ошибок остается в качестве упражнения для читателя):
Открытие и просмотр репозитория:
// 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);
Изменение репозитория:
// 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 -это очень простое приложение, которое побуждает пользователя для репо и отображает интерактивный и проживающий список своих тайников (все с ~ 20 строк кода в -[AppDelegate applicationDidFinishLaunching:]
)::
Через Gitupkit это базовое приложение также получает бесплатную неограниченную отмену/повтор, объединенные и бок о бок, выбор текста и копирование, сочетания клавиатуры и т. Д.
Этот исходный код также демонстрирует, как использовать некоторые другие контроллеры представления Gitupkit, а также создавать индивидуальную.
Гитдифф демонстрирует, как создать контроллер представления, который отображает живое обновление различия между HEAD
и рабочей и работой à la git diff HEAD
:
Gity - это клон Gitx, построенный с использованием Gitupkit и менее 200 строк кода:
IGIT - это тестовое приложение для iOS, которое просто использует Gitupkit для клонирования репозитория GitHub и выполнить коммит.
См. Appling.md.
Также большое спасибо прекрасным участникам Libgit2, без которых Гитуп никогда бы не существовал!
Gitup-Copyright 2015-2018 Pierre-Olivier Latour и доступен по лицензии GPL V3. См. Файл лицензии в проекте для получения дополнительной информации.
ВАЖНО: GITUP включает в себя некоторые другие проекты с открытым исходным кодом, и такие проекты остаются под их собственной лицензией.