如何在JGit中配置自定义凭证,使提交使用指定测试账号?
问题根源
你使用的CredentialsProvider仅负责远程仓库的权限验证(比如克隆、推送操作的身份校验),但Git提交记录的作者/提交者信息,是从Git的配置(全局或当前仓库级)中读取的,和凭证本身无关。所以要强制用测试账号提交,需要同时处理提交者信息和凭证验证两个环节。
解决方案
方法一:提交时显式指定作者/提交者
在git.commit()阶段,直接通过setAuthor()和setCommitter()方法指定测试账号的用户名和邮箱,这样提交记录就会显示该账号的身份信息:
// 替换为测试账号的实际用户名和邮箱 String testAccountName = "test-account-username"; String testAccountEmail = "test-account-email@xxx.com"; git.add().addFilepattern(".").call(); git.commit() .setMessage("test commit") .setAuthor(testAccountName, testAccountEmail) .setCommitter(testAccountName, testAccountEmail) .setCredentialsProvider(credentialsProvider) .call(); git.push().setCredentialsProvider(credentialsProvider).call();
方法二:配置仓库级别的用户信息
如果不想每次提交都手动设置作者信息,可以在克隆仓库后,直接配置当前仓库的user.name和user.email,后续所有提交都会自动使用该配置:
CredentialsProvider credentialsProvider = new UsernamePasswordCredentialsProvider("PAT_token_of_test_account", ""); Git git = Git.cloneRepository() .setURI("https://github.com/user/repo.git") .setDirectory(new File(folderName)) .setCredentialsProvider(credentialsProvider) .call(); // 配置当前仓库的用户信息(仅对这个仓库生效) RepositoryConfig repoConfig = git.getRepository().getConfig(); repoConfig.setString("user", null, "name", "test-account-username"); repoConfig.setString("user", null, "email", "test-account-email@xxx.com"); repoConfig.save(); // 后续提交无需再指定作者 git.add().addFilepattern(".").call(); git.commit().setMessage("test commit").setCredentialsProvider(credentialsProvider).call(); git.push().setCredentialsProvider(credentialsProvider).call();
额外注意:禁用本地凭证缓存
如果本地系统之前缓存过GitHub的凭证(比如系统密钥链、Git自带的凭证缓存),可能会覆盖你设置的CredentialsProvider。可以通过以下方式禁用缓存:
// 克隆时禁用缓存 Git git = Git.cloneRepository() .setURI("https://github.com/user/repo.git") .setDirectory(new File(folderName)) .setCredentialsProvider(credentialsProvider) .setTransportConfigCallback(transport -> { if (transport instanceof HttpTransport) { ((HttpTransport) transport).setCredentialsProvider(credentialsProvider); // 禁用HTTP连接缓存,避免复用旧凭证 ((HttpTransport) transport).getHttpConnectionFactory().setCache(null); } }) .call(); // 推送时同样配置 git.push() .setCredentialsProvider(credentialsProvider) .setTransportConfigCallback(transport -> { if (transport instanceof HttpTransport) { ((HttpTransport) transport).setCredentialsProvider(credentialsProvider); ((HttpTransport) transport).getHttpConnectionFactory().setCache(null); } }) .call();
内容的提问来源于stack exchange,提问作者Aryan
相关产品推荐
相关产品推荐

