1. Введение
JGit — это облегченная, чистая реализация библиотеки Java системы управления версиями Git, включая процедуры доступа к репозиторию, сетевые протоколы и основные алгоритмы управления версиями.
JGit — это относительно полнофункциональная реализация Git, написанная на Java и широко используемая в сообществе Java. Проект JGit находится под эгидой Eclipse, и его дом можно найти в JGit .
В этом уроке мы объясним, как с ним работать.
2. Начало работы
Есть несколько способов связать ваш проект с JGit и начать писать код. Вероятно, самый простой способ — использовать Maven — интеграция выполняется путем добавления следующего фрагмента в тег <dependencies>
в нашем файле pom.xml
:
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>4.6.0.201612231935-r</version>
</dependency>
Пожалуйста, посетите центральный репозиторий Maven для получения последней версии JGit. Как только этот шаг будет выполнен, Maven автоматически приобретет и будет использовать библиотеки JGit, которые нам понадобятся.
Если вы предпочитаете пакеты OSGi, есть также репозиторий p2. Пожалуйста, посетите Eclipse JGit , чтобы получить необходимую информацию о том, как интегрировать эту библиотеку.
3. Создание репозитория
JGit имеет два основных уровня API: сантехнический
и фарфоровый
. Терминология для них исходит из самого Git. JGit делится на такие же области:
API-интерфейсы фарфора
— внешний интерфейс для обычных действий на уровне пользователя (аналогично инструменту командной строки Git)API-интерфейсы сантехники
— прямое взаимодействие с низкоуровневыми объектами репозитория.
Отправной точкой для большинства сеансов JGit является класс 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
— используется для хранения файловых данныхдерево
– каталог; он ссылается на другиедеревья
икапли
commit
— указывает на одно деревоtag
— помечает коммит как особенный; обычно используется для маркировки конкретных выпусков
Чтобы разрешить объект из репозитория, просто передайте нужную ревизию, как в следующей функции:
ObjectId head = repository.resolve("HEAD");
4.1. Ссылка
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 более высокого уровня, который имитирует некоторые фарфоровые
команды Git в пакете org.eclipse.jgit.api .
5.1. ДобавитьКоманду
( git-добавить
)
Команда AddCommand
позволяет добавлять файлы в индекс с помощью:
добавить шаблон файла
()
Вот краткий пример того, как добавить набор файлов в индекс с помощью фарфорового
API:
Git git = new Git(db);
AddCommand add = git.add();
add.addFilepattern("someDirectory").call();
5.2. CommitCommand
( git-commit
)
CommitCommand позволяет выполнять коммиты и имеет следующие доступные параметры :
установитьАвтор
()установитьКоммиттер
()установить все
()
Вот краткий пример того, как зафиксировать с помощью API фарфора :
Git git = new Git(db);
CommitCommand commit = git.commit();
commit.setMessage("initial commit").call();
5.3. TagCommand
( git-тег
)
TagCommand поддерживает различные параметры тегов :
установитьИмя
()установитьсообщение
()setTagger
()установитьИдентификаторОбъекта
()установить форсеобновление
()установитьподписанный
()
Вот краткий пример пометки фиксации с помощью фарфорового
API:
Git git = new Git(db);
RevCommit commit = git.commit().setMessage("initial commit").call();
RevTag tag = git.tag().setName("tag").call();
5.4. LogCommand
( git-журнал
)
LogCommand позволяет легко просматривать график коммитов .
добавить (начало AnyObjectId)
addRange(AnyObjectId с тех пор, AnyObjectId до)
Вот краткий пример того, как получить некоторые сообщения журнала:
Git git = new Git(db);
Iterable<RevCommit> log = git.log().call();
6. Муравьиные задачи
В JGit также есть несколько общих задач Ant, содержащихся в пакете org.eclipse.jgit.ant .
Чтобы использовать эти задачи:
<taskdef resource="org/eclipse/jgit/ant/ant-tasks.properties">
<classpath>
<pathelement location="path/to/org.eclipse.jgit.ant-VERSION.jar"/>
<pathelement location="path/to/org.eclipse.jgit-VERSION.jar"/>
<pathelement location="path/to/jsch-0.1.44-1.jar"/>
</classpath>
</taskdef>
Это обеспечит задачи git-clone, git-init
и git-checkout
.
6.1. git-клон
<git-clone uri="http://egit.eclipse.org/jgit.git" />
Требуются следующие атрибуты:
uri
: URI для клонирования
Следующие атрибуты являются необязательными:
dest
: место назначения для клонирования (по умолчанию используется удобочитаемое имя каталога на основе последнего компонента путиURI
)bare
:true
/false
/yes
/no
, чтобы указать, должен ли клонированный репозиторий быть пустым или нет (по умолчаниюfalse
)branch
: начальная ветвь для извлечения при клонировании репозитория (по умолчаниюHEAD
)
6.2. git-инициализация
<git-init />
Для запуска задачи git-init атрибуты не требуются.
Следующие атрибуты являются необязательными:
dest
: путь, по которому инициализируется репозиторий git (по умолчанию$GIT_DIR
или текущий каталог)bare
:true
/false
/yes
/no
, чтобы указать, должен ли репозиторий быть голым или нет (по умолчаниюfalse
)
6.3. git-checkout
<git-checkout src="path/to/repo" branch="origin/newbranch" />
Требуются следующие атрибуты:
src
: путь к репозиторию gitветка
: начальная ветка для оформления заказа
Следующие атрибуты являются необязательными:
createbranch
:true
/false
/yes
/no
, чтобы указать, следует ли создавать ветку, если она еще не существует (по умолчаниюfalse
)force
:true
/false
/yes
/no
: еслиtrue
/yes
и ветка с данным именем уже существует, начальная точка существующей ветки будет установлена в новую начальную точку; еслиfalse
, существующая ветка не будет изменена (по умолчаниюfalse
)
7. Заключение
Высокоуровневый JGit API несложно понять. Если вы знаете, какую команду git использовать, вы можете легко догадаться, какие классы и методы использовать в JGit.
Коллекция готовых к запуску фрагментов кода JGit доступна здесь .
Если у вас все еще есть трудности или вопросы, оставьте комментарий здесь или обратитесь за помощью к сообществу JGit .