JGit 设置 git: URI 而不是 https: 用于 CircleCI 上的远程网址重写

2022-09-03 16:08:10

我有以下代码(请参阅有关正在发生的事情的注释):

// Clone repository from GitHub into a local directory.
Git git = Git.cloneRepository()
             .setBranch("gh-pages")
             .setURI("https://github.com/RAnders00/KayonDoc.git")
             .setDirectory(new File("/home/ubuntu/KayonDoc"))
             .call();

// Print out remotes in config from JGit
Config config = git.getRepository().getConfig();
config.getSubsections("remote").forEach(it -> {
    System.out.println(config.getString("remote", it, "url"));
});
// Prints https://github.com/RAnders00/KayonDoc.git
// Everything seems OK

// You could perform some changes to the repository here...

// Push changes to origin
git.push()
   .setCredentialsManager(new UsernamePasswordCredentialsProvider("RAnders00", "hunter2"))
   .call();
// Throws exception (look below)
Caught: org.eclipse.jgit.api.errors.TransportException: git@github.com:RAnders00/KayonDoc.git: push not permitted
org.eclipse.jgit.api.errors.TransportException: git@github.com:RAnders00/KayonDoc.git: push not permitted
        at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:164)
        at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:80)
        at <your class> (YourClass.java:?)
Caused by: org.eclipse.jgit.errors.TransportException: git@github.com:RAnders00/KayonDoc.git: push not permitted
        at org.eclipse.jgit.transport.BasePackPushConnection.noRepository(BasePackPushConnection.java:176)
        at org.eclipse.jgit.transport.BasePackConnection.readAdvertisedRefsImpl(BasePackConnection.java:200)
        at org.eclipse.jgit.transport.BasePackConnection.readAdvertisedRefs(BasePackConnection.java:178)
        at org.eclipse.jgit.transport.TransportGitSsh$SshPushConnection.<init>(TransportGitSsh.java:341)
        at org.eclipse.jgit.transport.TransportGitSsh.openPush(TransportGitSsh.java:166)
        at org.eclipse.jgit.transport.PushProcess.execute(PushProcess.java:154)
        at org.eclipse.jgit.transport.Transport.push(Transport.java:1200)
        at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:157)
        ... 3 more

JGit 正在将 git: url 保存到 .git/FETCH_HEAD 文件中,然后用于推送。由于协议不支持身份验证,因此我无法推送到远程,并且该过程失败。git:

该文件包含远程数据库的正确 URI(这就是代码打印 URI 的原因)。.git/confighttps:https:

我的问题是:

我该怎么做才能让JGit正确
设置https:URI(这将允许我再次推送)?


这个问题只出现在一个非常特殊的环境中(在CircleCI上,一个Ubuntu 12.04.2 LTS虚拟盒子) - 它在15.10,14.04 LTS和12.04.2 LTS新的Ubuntu发行版上不可重现,并且在Windows上不可重现。

重现此问题的最简单方法是创建一个虚拟 GitHub 存储库,然后开始在 CircleCI 上构建您的虚拟项目,然后使用 SSH 重新运行您的第一个构建。然后,您有30分钟的SSH时间将任何时髦/ java文件上传到框中。30分钟后,盒子将被强行关闭。


如果我在克隆到的目录中使用,我会得到:(这指向我确实使用了URI的事实)git remote -vgit:

origin  git@github.com:RAnders00/KayonDoc.git (fetch)
origin  git@github.com:RAnders00/KayonDoc.git (push)

答案 1

看起来您已经定义了

网址重写

Git 提供了一种使用以下配置重写 URL 的方法:

git config --global url."git://".insteadOf https://

要验证是否已设置它,请检查存储库的配置:

git config --list

您将在输出中看到以下行:

url.git://.insteadof=https://

您还可以检查文件以验证您的配置文件中没有此条目.gitconfig

[url "git://"]
    insteadOf = https://

答案 2

推荐