«1. Введение

JGit — это облегченная, чистая реализация библиотеки Java системы контроля версий Git, включая подпрограммы доступа к репозиторию, сетевые протоколы и основные алгоритмы контроля версий.

JGit — относительно полнофункциональная реализация Git, написанная на Java и широко используемая в сообществе Java. Проект JGit находится под эгидой Eclipse, и его дом можно найти в JGit.

В этом уроке мы объясним, как с ним работать.

2. Начало работы

Есть несколько способов подключить ваш проект к JGit и начать писать код. Вероятно, самый простой способ — это использовать Maven — интеграция выполняется путем добавления следующего фрагмента в тег \u003cdependencies\u003e в нашем файле 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 — используется для хранения файлового дерева данных — каталог; он ссылается на фиксацию других деревьев и больших двоичных объектов — указывает на один тег дерева — помечает фиксацию как особенную; обычно используется для маркировки определенных выпусков

Чтобы разрешить объект из репозитория, просто передайте правильную ревизию, как в следующей функции:

ObjectId head = repository.resolve("HEAD");

4.1. Ref

Ref — это переменная, которая содержит один идентификатор объекта. Идентификатором объекта может быть любой допустимый объект Git (большой двоичный объект, дерево, фиксация, тег).

Например, чтобы запросить ссылку на голову, вы можете просто позвонить:

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. Porcelain API

Хотя JGit содержит много низкоуровневого кода для работы с репозиториями Git, он также содержит API более высокого уровня, который имитирует некоторые фарфоровых команд Git в пакете org.eclipse.jgit.api.

5.1. AddCommand (git-add)

Команда AddCommand позволяет добавлять файлы в индекс с помощью:

    addFilepattern()

Вот краткий пример того, как добавить набор файлов в индекс с помощью фарфорового API:

Git git = new Git(db);
AddCommand add = git.add();
add.addFilepattern("someDirectory").call();

5.2. CommitCommand (git-commit)

CommitCommand позволяет выполнять коммиты и имеет следующие доступные опции:

    setAuthor() setCommitter() setAll()

Вот краткий пример того, как делать коммиты с использованием фарфорового API:

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()

Вот краткий пример пометки фиксации с помощью фарфорового 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-log)

LogCommand позволяет легко просматривать график коммитов.

    add(AnyObjectId start) addRange(AnyObjectId с тех пор, AnyObjectId до)

Вот краткий пример того, как получить некоторые сообщения журнала:

Git git = new Git(db);
Iterable<RevCommit> log = git.log().call();

6. Задачи Ant

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-clone

<git-clone uri="http://egit.eclipse.org/jgit.git" />

Требуются следующие атрибуты:

    uri: URI для клонирования

Следующие атрибуты являются необязательными:

    dest: место назначения для клонирования (по умолчанию используется человеческий удобочитаемое имя каталога, основанное на последнем компоненте пути URI) bare: true/false/yes/no, чтобы указать, должен ли клонированный репозиторий быть пустым или нет (по умолчанию false) branch: начальная ветвь, которую нужно проверить при клонировании репозитория (по умолчанию ГОЛОВА)

6.2. git-init

<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.