Руководство по JGit
1. Вступление
JGit - это легковесная, чистая реализация библиотеки Java системы контроля версий Git, включая процедуры доступа к репозиторию, сетевые протоколы и основные алгоритмы контроля версий.
JGit является относительно полнофункциональной реализацией Git, написанной на Java, и широко используется в сообществе Java. Проект JGit находится под эгидой Eclipse, и его домашняя страница находится вJGit.
В этом руководстве мы объясним, как с ним работать.
2. Начиная
Есть несколько способов соединить ваш проект с JGit и начать писать код. Вероятно, самый простой способ - использовать Maven - интеграция достигается путем добавления следующего фрагмента в тег<dependencies> в нашем файлеpom.xml:
org.eclipse.jgit
org.eclipse.jgit
4.6.0.201612231935-r
ПосетитеMaven Central repository для получения последней версии JGit. Как только этот шаг будет выполнен, Maven автоматически получит и использует библиотеки JGit, которые нам понадобятся.
Если вы предпочитаете пакеты OSGi, есть также репозиторий p2. ПосетитеEclipse JGit, чтобы получить необходимую информацию о том, как интегрировать эту библиотеку.
3. Создание хранилища
JGit имеет два основных уровня API:plumbing иporcelain. Терминология для этого происходит от самого Git. JGit делится на те же области:
-
porcelain API - интерфейс для общих действий на уровне пользователя (аналогично инструменту командной строки Git)
-
APIplumbing - прямое взаимодействие с низкоуровневыми объектами репозитория
Отправной точкой для большинства сеансов JGit является классRepository. Первое, что мы собираемся сделать, это создать новый экземплярRepository.
Командаinit позволит нам создать пустой репозиторий:
Git git = Git.init().setDirectory("/path/to/repo").call();
Это создаст репозиторий с рабочим каталогом в месте, указанном дляsetDirectory().
Существующий репозиторий можно клонировать с помощью командыcloneRepository:
Git git = Git.cloneRepository()
.setURI("https://github.com/eclipse/jgit.git")
.setDirectory("/path/to/repo")
.call();
Приведенный выше код клонирует репозиторий JGit в локальный каталог с именемpath/to/repo.
4. Объекты Git
Все объекты представлены идентификатором SHA-1 в объектной модели Git. В JGit это представлено классамиAnyObjectId иObjectId.
В объектной модели Git есть четыре типа объектов:
-
blob - используется для хранения файловых данных
-
tree - каталог; он ссылается на другиеtrees иblobs
-
commit - указывает на одно дерево
-
tag - помечает фиксацию как особую; обычно используется для обозначения конкретных выпусков
Чтобы разрешить объект из репозитория, просто передайте правильную ревизию, как в следующей функции:
ObjectId head = repository.resolve("HEAD");
4.1. Refс
Ref - это переменная, содержащая единственный идентификатор объекта. Идентификатором объекта может быть любой действительный объект Git (blob,tree,commit,tag).
Например, чтобы запросить ссылку на заголовок, вы можете просто позвонить:
Ref HEAD = repository.getRef("refs/heads/master");
4.2. RevWalkс
RevWalk просматривает график фиксации и производит соответствующие фиксации в следующем порядке:
RevWalk walk = new RevWalk(repository);
4.3. RevCommitс
RevCommit представляет фиксацию в объектной модели Git. Чтобы проанализировать фиксацию, используйте экземплярRevWalk:
RevWalk walk = new RevWalk(repository);
RevCommit commit = walk.parseCommit(objectIdOfCommit);
4.4. RevTagс
RevTag представляет тег в объектной модели Git. Вы можете использовать экземплярRevWalk для анализа тега:
RevWalk walk = new RevWalk(repository);
RevTag tag = walk.parseTag(objectIdOfTag);
4.5. RevTreeс
RevTree представляет дерево в объектной модели Git. ЭкземплярRevWalk также используется для анализа дерева:
RevWalk walk = new RevWalk(repository);
RevTree tree = walk.parseTree(objectIdOfTree);
5. Фарфор API
Хотя JGit содержит много низкоуровневого кода для работы с репозиториями Git, он также содержит API более высокого уровня, который имитирует некоторые команды Gitporcelain в пакетеorg.eclipse.jgit.api.
5.1. AddCommand (git-add)
AddCommand позволяет добавлять файлы в индекс с помощью:
-
addFilepattern ()
Вот быстрый пример того, как добавить набор файлов в индекс с помощью APIporcelain:
Git git = new Git(db);
AddCommand add = git.add();
add.addFilepattern("someDirectory").call();
5.2. CommitCommand (git-commit)
CommitCommand позволяет выполнять коммиты и имеет следующие доступные параметры:
-
setAuthor ()
-
setCommitter ()
-
setAll ()
Вот быстрый пример того, как выполнить фиксацию с помощью APIporcelain:
Git git = new Git(db);
CommitCommand commit = git.commit();
commit.setMessage("initial commit").call();
5.3. TagCommand (git-tag)
TagCommand поддерживает множество вариантов тегов:
-
setName ()
-
setMessage ()
-
setTagger ()
-
setObjectId ()
-
setForceUpdate ()
-
setSigned ()
Вот быстрый пример пометки фиксации с помощью APIporcelain:
Git git = new Git(db);
RevCommit commit = git.commit().setMessage("initial commit").call();
RevTag tag = git.tag().setName("tag").call();
5.4. LogCommand (git-log)
LogCommand позволяет легко перемещаться по графику фиксации.
-
добавить (начало AnyObjectId)
-
addRange (AnyObjectId с, AnyObjectId до)
Вот краткий пример того, как получить сообщения журнала:
Git git = new Git(db);
Iterable log = git.log().call();
6. Задачи Муравьев
JGit также имеет некоторые общие задачи Ant, содержащиеся в пакетеorg.eclipse.jgit.ant.
Чтобы использовать эти задачи:
Это предоставит задачиgit-clone, git-init иgit-checkout.
6.1. git-cloneс
Требуются следующие атрибуты:
-
uri: URI для клонирования из
Следующие атрибуты являются необязательными:
-
dest: место назначения для клонирования (по умолчанию используется удобочитаемое имя каталога на основе последнего компонента путиURI)
-
bare:true /false /yes /no, чтобы указать, должен ли клонированный репозиторий быть пустым или нет (по умолчаниюfalse)
-
branch: начальная ветка для проверки при клонировании репозитория (по умолчаниюHEAD)
6.2. git-initс
Для выполнения задачиgit-init атрибуты не требуются.
Следующие атрибуты являются необязательными:
-
dest: путь, по которому инициализируется репозиторий git (по умолчанию$GIT_DIR или текущий каталог)
-
bare:true /false /yes /no, чтобы указать, должен ли репозиторий быть пустым или нет (по умолчаниюfalse)
6.3. git-checkoutс
Требуются следующие атрибуты:
-
src: путь к репозиторию git
-
branch: начальная ветвь для оформления заказа
Следующие атрибуты являются необязательными:
-
createbranch:true /false /yes /no, чтобы указать, следует ли создавать ветку, если она еще не существует (по умолчаниюfalse)
-
force:true /false /yes /no: еслиtrue /yes и ветвь с данным именем уже существует, начальная точка существующей ветви будет установлена на новую начальную точку; еслиfalse, существующая ветка не будет изменена (по умолчаниюfalse)
7. Заключение
API высокого уровня JGit не сложно понять. Если вы знаете, какую команду git использовать, вы можете легко угадать, какие классы и методы использовать в JGit.
Доступен набор готовых к запуску фрагментов кода JGithere.
Если у вас все еще есть трудности или вопросы, оставьте здесь комментарий или обратитесь за помощью кJGit community.