Java 使用JGit授权错误推送到GitLab
我可以通过JGit从GitLab进行克隆,但当我去推送更改时,会收到一条Java 使用JGit授权错误推送到GitLab,java,git,gitlab,jgit,oauth2,Java,Git,Gitlab,Jgit,Oauth2,我可以通过JGit从GitLab进行克隆,但当我去推送更改时,会收到一条未授权的错误消息 还有三个更重要的细节: 我拥有存储库,因此它不是只读访问的问题 存储库是私有的,因此我知道OAuth 2令牌是有效的,并且正在初始克隆中使用 我只有用户名和oauth2令牌。我没有用户的密码、SSH密钥或个人访问令牌 以下是我的克隆命令: Git.cloneRepository() .setURI(target) .setDirectory(repoFolder) .setCloneAllBra
未授权的错误消息
还有三个更重要的细节:
我拥有存储库,因此它不是只读访问的问题
存储库是私有的,因此我知道OAuth 2令牌是有效的,并且正在初始克隆中使用
我只有用户名和oauth2令牌。我没有用户的密码、SSH密钥或个人访问令牌
以下是我的克隆命令:
Git.cloneRepository()
.setURI(target)
.setDirectory(repoFolder)
.setCloneAllBranches(true)
.setCredentialsProvider(new UsernamePasswordCredentialsProvider("oauth2", token))
.call();
这是我推的命令:
PushCommand push = cloneSource.push();
push.setRemote(target);
push.setPushAll();
push.setCredentialsProvider(new UsernamePasswordCredentialsProvider("oauth2", token));
push.call();
通过下面的代码片段,我可以从GitLab存储库中克隆并推回到该存储库
CredentialsProvider credentialsProvider = new
UsernamePasswordCredentialsProvider( "PRIVATE-TOKEN", <your oauth token> );
git.push()
.setCredentialsProvider( credentialsProvider )
.call();
CredentialsProvider CredentialsProvider
=新用户名PasswordCredentialsProvider(“myname”、“password”);
Git Git=Git.cloneRepository()
.setURI(“https://gitlab.com/myname/repo.git" )
.setDirectory(tempFolder.newFolder())
.setCredentialsProvider(credentialsProvider)
.call();
File File=新文件(git.getRepository().getWorkTree(),“File”+新对象().hashCode());
createNewFile();
git.add().addFilepattern(file.getName()).call();
git.commit().setMessage(“添加文件”+file.getName()).call();
git.push()
.setCredentialsProvider(credentialsProvider)
.call();
如果您使用的是GitLab的个人访问令牌,则需要将访问令牌编码到URL中,并将其作为密码提供,如下所示:
CredentialsProvider CredentialsProvider
=新用户名PasswordCredentialsProvider(“myname”和“”);
command.setURI(“https://gitlab-ci-token:@gitlab.com/myname/repo.git)
command.setCredentialsProvider(credentialsProvider)
也许这将有助于找到“未授权”错误的来源。为了通过SSH进行通信,您需要将SSH密钥添加到GitLab配置文件。要使用个人访问令牌和jgit对GitLab进行身份验证,可以使用以下代码段:
通过下面的代码片段,我可以推回到GitLab存储库
CredentialsProvider credentialsProvider = new
UsernamePasswordCredentialsProvider( "PRIVATE-TOKEN", <your oauth token> );
git.push()
.setCredentialsProvider( credentialsProvider )
.call();
CredentialsProvider CredentialsProvider=new
UsernamePasswordCredentialsProvider(“专用令牌”);
git.push()
.setCredentialsProvider(credentialsProvider)
.call();
这从Jgit版本(4.8.0.201706111038-r)起生效。我正在使用OAuth2访问令牌从Jgit使用Git.lsRemoteRepository()方法
像这样设置UsernamePasswordCredentialsProvider实际上对我有用:
LsRemoteCommand cmd = Git.lsRemoteRepository();
cmd.setRemote(cloneUrl);
cmd.setCredentialsProvider(new UsernamePasswordCredentialsProvider("oauth2", gitlab-access-token));
该url是一个私有Gitlab存储库的url-
您使用哪种协议进行克隆和推送?必须向凭据提供程序提供您的真实用户名(即,该用户名也是URL的一部分)。oauth2
是您的真实用户名吗?您问题中的第3点表明您没有足够的权限对推送进行身份验证。我使用的是HTTP协议。。我试着用我的真实用户名而不是oauth2,但这也不起作用。使用我的用户名,我甚至无法克隆回购协议。@dlamblin我不确定我是否理解。。。有了GitHub,这一切都很好,GitLab中的oauth2令牌有什么不同吗?我想我没有提到这一点,我将没有用户的密码、SSH密钥或个人访问令牌。我能访问的唯一信息是用户名和oauth2令牌。@user3817808您能描述一下GitLab的web UI用户名和oauth令牌是如何/在何处管理的,以便我能够重现您的环境吗?我不知道如何通过web UI获取oauth令牌,但我可以按照以下流程获得:PS我确实拥有测试用户的用户名/密码,但对于我的应用程序的所有其他用户,我不会。谢谢你让我知道。从我的尝试来看,RESTAPI的功能与Profile Settings>Applications中的web UI相同。我已经发布了你的问题——用我自己的话来说——我相信你从UI中得到的只是一个应用程序id/秘密。。这与oauth2令牌不同。查看您的GitLab帖子,您应该能够使用git clone进行克隆https://oauth2:a1b2c3@gitlab.com/user/repo.git
,至少我能。这应该是公认的答案;它工作得很好。非常感谢您的分享。