1前書き

JGitはGitバージョン管理システムの軽量で純粋なJavaライブラリ実装です – リポジトリアクセスルーチン、ネットワークプロトコル、コアバージョン管理アルゴリズムを含みます。

JGitはJavaで書かれたGitの比較的フル機能の実装であり、Javaコミュニティで広く使われています。 JGitプロジェクトはEclipseの傘下にあり、そのホームはhttps://eclipse.org/jgit/[JGit]にあります。

このチュートリアルでは、その使い方について説明します。


2入門

プロジェクトをJGitに接続してコードを書き始める方法はいくつかあります。おそらく最も簡単な方法はMavenを使うことです – 統合は私たちの

pom.xml

ファイルの

<dependencies>

タグに以下のスニペットを追加することによって達成されます:

<dependency>
    <groupId>org.eclipse.jgit</groupId>
    <artifactId>org.eclipse.jgit</artifactId>
    <version>4.6.0.201612231935-r</version>
</dependency>

JGitの最新版については、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22org.eclipse.jgit%22[Maven Centralリポジトリ]をご覧ください。このステップが完了すると、Mavenは必要なJGitライブラリを自動的に取得して使用します。

OSGiバンドルを好むなら、p2リポジトリもあります。このライブラリを統合する方法についての必要な情報を得るためにhttp://www.eclipse.org/jgit/download/[Eclipse JGit]を訪問してください。


3リポジトリを作成する

JGitには2つの基本的なレベルのAPIがあります:

plumbing



porcelain

。これらの用語はGit自体から来ています。 JGitは同じ分野に分かれています。


  • porcelain

    API – 一般的なユーザーレベルのアクションのフロントエンド(に似ています)

Gitコマンドラインツール)
**

plumbing

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オブジェクト

Gitオブジェクトモデルでは、すべてのオブジェクトがSHA-1 IDで表されています。 JGitでは、これは

AnyObjectId

クラスと

ObjectId

クラスによって表されます。

Gitオブジェクトモデルには、4種類のオブジェクトがあります。


  • blob

    – ファイルデータの保存に使用されます


  • tree

    – ディレクトリ。他の

    trees



    blobs

    を参照します。


  • commit

    – 単一のツリーを指します


  • tag

    – コミットを特別なものとしてマークします。一般的に特定のマーキングに使用されます

リリース

リポジトリからオブジェクトを解決するには、次の関数のように正しいリビジョンを渡すだけです。

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


4.1.

Ref



Ref

は、単一のオブジェクト識別子を保持する変数です。オブジェクト識別子は、任意の有効なGitオブジェクト(

blob



tree



commit



tag

)にすることができます。

たとえば、headへの参照を問い合わせるには、次のように呼び出すだけです。

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リポジトリーを操作するための低レベルのコードが多数含まれていますが、

org.eclipse.jgit.api

パッケージ内のGit

porcelain

コマンドの一部を模倣した高レベルのAPIも含まれています。




AddCommand

を使用すると、ファイルをインデックスに追加できます。


  • addFilepattern

    ()

これは、

porcelain

APIを使用して一連のファイルをインデックスに追加する方法の簡単な例です。

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




CommitCommand

を使用すると、コミットを実行できます。使用可能なオプションは次のとおりです。


  • setAuthor

    ()


  • setCommitter

    ()


  • setAll

    ()

これは

porcelain

APIを使ってコミットする方法の簡単な例です:

Git git = new Git(db);
CommitCommand commit = git.commit();
commit.setMessage("initial commit").call();




TagCommand

は、さまざまなタグ付けオプションをサポートしています。


  • setName

    ()


  • setMessage

    ()


  • setTagger

    ()


  • setObjectId

    ()


  • setForceUpdate

    ()


  • setSigned

    ()

これは、

porcelain

APIを使用してコミットをタグ付けする簡単な例です。

Git git = new Git(db);
RevCommit commit = git.commit().setMessage("initial commit").call();
RevTag tag = git.tag().setName("tag").call();




LogCommand

を使用すると、コミットグラフを簡単に確認できます。


  • add(AnyObjectId start)


  • addRange(AnyObjectId since、AnyObjectIdまで)

ログメッセージを取得する方法の簡単な例を示します。

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


6. Antのタスク

JGitには

org.eclipse.jgit.ant

バンドルに含まれるいくつかの一般的な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

タスクを提供します。



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

以下の属性が必要です。


  • uri

    :複製元のURI

以下の属性はオプションです。


  • dest

    :クローン先の宛先


URI

)の最後のパスコンポーネントに基づくディレクトリ名
**

bare

:

true

/

false

/

yes

/

no

はクローンされたリポジトリか

裸かそうでないか(デフォルトは

false


**

branch

:リポジトリをクローンするときにチェックアウトする最初のブランチ

(デフォルトは

HEAD



<git-init/>


git-init

タスクを実行するために属性は必要ありません。

以下の属性はオプションです。


  • dest

    :gitリポジトリが初期化されるパス(デフォルトは


$ GIT

DIR

または現在のディレクトリ)
**

bare

:

true

/

false

/

yes

/

no__は、リポジトリが必要かどうか

裸かそうでないか(デフォルトは

false



<git-checkout src="path/to/repo" branch="origin/newbranch"/>

以下の属性が必要です。


  • src

    :gitリポジトリへのパス


  • branch

    :チェックアウトへの最初の分岐

以下の属性はオプションです。


  • createbranch

    :

    true

    /

    false

    /

    yes

    /

    no

    は、

ブランチが存在しない場合は作成する必要があります(デフォルトは

false


**

force

:

true

/

false

/

yes

/

no

:if

true

/

yes

とブランチの場合

指定された名前がすでに存在する場合、既存のブランチの始点は新しい始点に設定されます。

false

の場合、既存のブランチは変更されません(デフォルトは

false


7. 結論

高レベルのJGit APIを理解するのは難しいことではありません。どのgitコマンドを使うべきか知っていれば、JGitでどのクラスとメソッドを使うべきか容易に推測できます。


こちら

には、すぐに実行可能なJGitコードスニペットのコレクションがあります。

それでも問題や質問がある場合は、ここにコメントを残すか、https://www.eclipse.org/jgit/support/[JGitコミュニティ]に支援を依頼してください。