Перейти к основному содержимому

Руководство по JGit

· 6 мин. чтения

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 .