gpt4 book ai didi

java - 使用 jgit : Remote does not have available for fetch 获取 Git 失败

转载 作者:搜寻专家 更新时间:2023-11-01 02:50:59 26 4
gpt4 key购买 nike

我有一个裸仓库位于 main.git并试图在另一个仓库 foo 中获取一个分支(比方说 test) , 这刚刚是 git init 'd:

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

使用常规的 git 命令,我可以执行 git fetch ../main.git foo:foo这将创建一个新分支 footest/并获取分支所需的对象。 然后我想做同样的事情,但以编程方式使用 JGit,即不使用 git CLI,而是仅使用 Java 代码。我无法使用 git CLI:

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)

我如何让它工作?

最佳答案

什么应该起作用:

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 class提及:

/**
* 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() function on api.FetchCommand采用名称或 URI。

并查看 FetchCommandTest URI 定义,我更喜欢让远程更可见:
我宁愿为您的第二个存储库(引用您的第一个存储库)定义一个命名的远程(如下:“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();

关于java - 使用 jgit : Remote does not have <branchname> available for fetch 获取 Git 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11304261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com