使用JGit克隆GitHub私有仓库时出现未授权异常的问题排查
你用JGit克隆GitHub私有仓库的代码如下:
CloneCommand cloneCommand = Git.cloneRepository(); cloneCommand.setURI( "https://github.com/xxx/testing.git" ); cloneCommand.setCredentialsProvider( new UsernamePasswordCredentialsProvider( "username", "password" ) ); cloneCommand.setDirectory(new File("C:\Users\xxx\Desktop\clone")); cloneCommand.call();
收到的异常信息:
Exception in thread "main" org.eclipse.jgit.api.errors.TransportException: https://github.com/xxx/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) at org.example.Main.main(Main.java:45) Caused by: org.eclipse.jgit.errors.TransportException: https://github.com/xxx/testing.git: not authorized at org.eclipse.jgit.transport.TransportHttp.connect(TransportHttp.java:685) at org.eclipse.jgit.transport.TransportHttp.openFetch(TransportHttp.java:465) at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:153) at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:105) at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1462) at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:238) ... 3 more
以下是导致该异常的常见原因:
使用GitHub账号密码而非个人访问令牌(PAT)
GitHub早已停止支持通过HTTPS使用账号密码进行Git操作,必须使用个人访问令牌(PAT)作为密码。你需要在GitHub账号设置中生成一个带有repo权限的PAT,然后将UsernamePasswordCredentialsProvider的第二个参数替换为这个PAT,第一个参数仍为你的GitHub用户名。PAT权限不足
即使使用了PAT,如果生成时没有勾选repo权限(包含私有仓库的读写权限),也会触发未授权异常。需要进入GitHub的PAT管理页面,检查并确保权限列表中勾选了repo相关权限。凭证信息错误
检查GitHub用户名、PAT是否存在拼写错误:PAT是严格区分大小写和字符的,一旦输错就会验证失败;用户名虽然不区分大小写,但也需确保和账号一致。仓库URL或访问权限问题
确认仓库URL是否正确,比如仓库所有者、仓库名是否拼写错误;同时要确保当前GitHub账号确实拥有该私有仓库的访问权限(比如是否被仓库所有者添加为协作者)。网络代理拦截
如果处于公司或受限制的网络环境下,代理服务器可能会拦截Git请求,导致凭证无法正确传递给GitHub服务器。需要为JGit配置对应的代理信息,确保请求能正常到达GitHub。路径转义问题(非直接原因,但需注意)
代码中本地路径C:\Users\xxx\Desktop\clone存在转义问题,Java中反斜杠需要双重转义为C:\\Users\\xxx\\Desktop\\clone,或者使用正斜杠C:/Users/xxx/Desktop/clone。虽然这不会直接导致未授权异常,但会引发后续的目录创建错误,建议修正。
内容的提问来源于stack exchange,提问作者Thend

