5

にベアリポジトリがあり、別のリポジトリでmain.gitブランチ(たとえば、)をフェッチしようとしています。footestgit init

fetchtest/
  |- main.git/
  |- test/
       |- .git/

通常のgitコマンドを使用して、を実行できます。git fetch ../main.git foo:fooこれにより、新しいブランチが作成footest/れ、ブランチに必要なオブジェクトがフェッチされます。次に、同じことをプログラムでJGitを使用して実行したいと思います。つまり、git CLIを使用せず、Javaコードのみを使用します。gitCLIを使用する方法はありません。

Git git = Git.init().setDirectory(new File("fetchtest/test/")).call();

git.fetch().setRemote(new File("../main.git"))
           .setRefSpecs(new RefSpec("foo:foo"))
           .call();

しかし、それはただエラーになります:

org.eclipse.jgit.api.errors.TransportException: Remote does not have foo available for fetch.
    at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:137)
    // ......
Caused by: org.eclipse.jgit.errors.TransportException: Remote does not have foo available for fetch.
    at org.eclipse.jgit.transport.FetchProcess.expandSingle(FetchProcess.java:349)
    at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:139)
    at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:113)
    at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1069)
    at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128)

これを機能させるにはどうすればよいですか?

4

1 に答える 1

5

何が機能するか:

Git git = Git.init().setDirectory(new File("fetchtest/test/")).call();

git.fetch().setRemote(new File("../main.git"))
           .setRefSpecs(new RefSpec("refs/heads/foo:refs/heads/foo"))
           .call();

RefSpec定義に注意してください。
少なくとも、あなたの例で試してみてください:

new RefSpec("refs/heads/foo:refs/heads/foo")

RefSpecクラスは言及します:

/**
 * Parse a ref specification for use during transport operations.
 * <p>
 * Specifications are typically one of the following forms:
 * <ul>
 * <li><code>refs/head/master</code></li>
 * <li><code>refs/head/master:refs/remotes/origin/master</code></li>
 * <li><code>refs/head/*:refs/remotes/origin/*</code></li>
 * <li><code>+refs/head/master</code></li>
 * <li><code>+refs/head/master:refs/remotes/origin/master</code></li>
 * <li><code>+refs/head/*:refs/remotes/origin/*</code></li>
 * <li><code>:refs/head/master</code></li>
 * </ul>
 *
 * @param spec
 * string describing the specification.
 * @throws IllegalArgumentException
 * the specification is invalid.
*/

したがって、「refs/head/」は必須のようです。


元の答え:

上のsetRemote()関数api.FetchCommandは名前またはURIを取ります。

そして、FetchCommandTestURI定義を見ると、リモートをより見やすくすることを好みます。2番目のリポジトリ(最初のリポジトリを参照)に
名前付きリモート(以下: " test")を定義してから、フェッチします。

// setup the first repository to fetch from the second repository
final StoredConfig config = db.getConfig();
RemoteConfig remoteConfig = new RemoteConfig(config, "test");
URIish uri = new URIish(db2.getDirectory().toURI().toURL());
remoteConfig.addURI(uri);
remoteConfig.update(config);
config.save();

// create some refs via commits and tag
RevCommit commit = git2.commit().setMessage("initial commit").call();
Ref tagRef = git2.tag().setName("tag").call();

Git git1 = new Git(db);

RefSpec spec = new RefSpec("refs/heads/master:refs/heads/x");
git1.fetch().setRemote("test").setRefSpecs(spec)
.call();
于 2012-07-03T06:06:15.853 に答える