我非常非常简单的测试代码总是失败。我无法访问我自己的存储库(私人)(它是全新的且空的)。用户名和密码工作正常,我测试了多次登录和退出。我浏览了几篇 StackOverflow 帖子,但仍然不知道是什么导致了这个问题。我已经厌倦了两种不同的方式,首先克隆存储库(此时提供凭据),然后推送。我的第二次尝试是创建一个存储库,提交一些内容而不是推送(此时提供凭据)。这些都不起作用。
JGit 错误消息:
Exception in thread "main" org.eclipse.jgit.api.errors.TransportException: https://github.com/USERNAME/testing.git: not authorized
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:249)
at org.eclipse.jgit.api.CloneCommand.fetch(CloneCommand.java:325)
at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:191)
Java代码(第一种方式):
public static void main(String[] args) throws GitAPIException, IOException {
CredentialsProvider credentialsProvider
= new UsernamePasswordCredentialsProvider( "XXXXXXXXXX", "XXXXXXXXXX" );
Git git = Git.cloneRepository()
.setURI( "XXXXXXXXXX" )
.setDirectory(new File(System.getProperty("user.home") + File.separator + "git_test"))
.setCredentialsProvider( credentialsProvider )
.call();
File file = new File( git.getRepository().getWorkTree(), "file" + new Object().hashCode() );
file.createNewFile();
git.add().addFilepattern( file.getName() ).call();
git.commit().setMessage( "Add file " + file.getName() ).call();
git.push()
.setCredentialsProvider( credentialsProvider )
.call();
}
}
Java代码(第二种方式):
this.git = Git.init().setDirectory(new File(folderPath)).call();
this.git.add().addFilepattern("temp.txt").call();
this.git.commit().setMessage("Modified temp.txt").call();
this.git.push().setRemote(textfield.getText())
.setCredentialsProvider(new UsernamePasswordCredentialsProvider("XXXXXXX", "XXXXXX"))
.call();
你知道发生了什么事吗?
根据Github: “对于开发人员来说,如果您今天使用密码来验证 GitHub.com 上的 Git 操作,则必须在 2021 年 8 月 13 日之前开始通过 HTTPS(推荐)或 SSH 密钥使用个人访问令牌,以避免中断。如果您收到警告您正在使用过时的第三方集成,您应该将客户端更新到最新版本。” 此处描述
因此,我必须生成一个令牌,我按以下方式执行操作: 个人访问令牌(经典)生成...
之后,在 setCredentialsProvider() 方法中我给出了以下内容:
.setCredentialsProvider( new UsernamePasswordCredentialsProvider( "<token>", "" ) );
密码必须留空,只需提供令牌即可。
您可以尝试将凭据嵌入到 URI 中。以下作品
UsernamePasswordCredentialsProvider cr = new UsernamePasswordCredentialsProvider("username", "password");
Git.cloneRepository()
.setURI("https://{username}:{pasword}@https://github.com/eclipse/jgit.git")
.setCredentialsProvider(cr).setDirectory(new File("/path/to/checkout"))
.setBranchesToClone(Arrays.asList("refs/heads/branch-name")).setBranch("branch-name").call();