本文章旨在提供,在java开发环境下,使用eclipse提供的jgit工具实现与远端git仓建立连接,拉取代码和提交
一、拉取代码
首先UsernamePasswordCredentialsProvider这个类,用于封装远端git地址的账户名和密码
import org.eclipse.jgit.api.CloneCommand;
static CredentialsProvider provider = new UsernamePasswordCredentialsProvider("userName", "password");
static final String DEFAULT_REMOTE_NAME = "origin";
/**
* 拉取远端代码并切换分支
*
* @param filePath 本地文件路径
* @param remoteGitUrl 远端git地址
* @param branchName 分支名
*/
public static void cloneAndCheckOutBranch(String filePath, String remoteGitUrl, String branchName) {
Git git = null;
try {
boolean remoteRepositoryExist = remoteRepositoryExist(remoteGitUrl);
if (remoteRepositoryExist) {
git = Git.cloneRepository()
.setDirectory(new File(filePath))
.setURI(remoteGitUrl)
.setCredentialsProvider(provider)
.call();
} else {
git = Git.init().setDirectory(new File(filePath)).call();
git.remoteAdd()
.setName(Constant.DEFAULT_REMOTE_NAME)
.setUri(new URIish(remoteGitUrl))
.call();
git.add().addFilepattern(".").call();
git.commit().setMessage("Initial commit").call();
}
log.info("start to clone code");
//生成身份信息
// 如果文件目录下生成了.git仓 即是代码仓初始化了
String currentBranch = git.getRepository().getBranch();
// 如果本地有该分支
if (branchIsExistInLocal(git, branchName)) {
// 切换分支
git.checkout().setCreateBranch(false).setName(branchName).call();
} else if (!currentBranch.equals(branchName)) {
// 创建并切换分支
git.checkout().setCreateBranch(true).setName(branchName).call();
}
// 如果不是待切换分支 切换分支并拉取代码
log.info("create branch begin->{}", branchName);
if (branchIsExistInRemote(git, branchName)) {
// 如果远端有该目标分支 先拉取代码
git.pull().setCredentialsProvider(provider).call();
git.push().setCredentialsProvider(provider).call();
} else {
git.push().setCredentialsProvider(provider).call();
}
log.info("create branch end->{}", branchName);
} catch (Exception e) {
log.error("JgitUtil.checkoutBranch;错误;拉取指定分支代码失败;异常信息:{}", e);
} finally {
if (git != null) {
git.close();
}
}
}
/**
* 检验本地是否存在该分支
*
* @param branchName 分支名
* @return 存在结果
*/
private static boolean branchIsExistInLocal(Git git, String branchName) throws GitAPIException {
try {
Collection<Ref> refs = git.branchList().call();
//检查是否存在
for (Ref ref : refs) {
if (ref.getName() != null && ref.getName().equals(Constants.R_HEADS + branchName)) {
return true;
}
}
return false;
} catch (TransportException e) {
throw new BusinessException("Git库用户名密码错误,请重新配置!");
} catch (GitAPIException e) {
log.error("验证指定分支是否已在远程库创建时,发生错误", e);
throw e;
}
/**
* 检验分支是否在远端存在
*
* @param branchName 分支名
* @return 存在结果
*/
private static boolean branchIsExistInRemote(Git git, String branchName) throws GitAPIException {
try {
//将本地远程分支信息与远程仓库同步
git
.fetch()
.setCheckFetchedObjects(true)
.setRemoveDeletedRefs(true)
.setCredentialsProvider(provider)
.call();
Collection<Ref> refs = git.lsRemote().setCredentialsProvider(provider).call();
//检查是否存在
for (Ref ref : refs) {
if (ref.getName() != null && ref.getName().endsWith(branchName)) {
return true;
}
}
return false;
} catch (TransportException e) {
throw new BusinessException("Git库用户名密码错误,请重新配置!");
} catch (GitAPIException e) {
log.error("验证指定分支是否已在远程库创建时,发生错误", e);
throw e;
}
}
/**
* 判断远程仓库是不是存在
*
* @param remoteUrl 远程仓库地址
* @return true(存在)/false(不存在)
*/
public static boolean remoteRepositoryExist(String remoteUrl) {
try {
Collection<Ref> refs = (Collection<Ref>) Git.lsRemoteRepository()
.setHeads(true)
.setTags(true)
.setCredentialsProvider(provider)
.setRemote(remoteUrl)
.call();
return !refs.isEmpty();
} catch (Exception e) {
log.warn("仓库{}不存在", remoteUrl);
return false;
}
}
报红的话直接import进去就好了
filePath是绝对路径(文件夹:E:\gitCommit这种类型)
remoteGitUrl是远端git地址 http://*****/*****/****.git
branch直接传入名字 比如master
二、推送代码
import org.eclipse.jgit.api.CloneCommand;
static CredentialsProvider provider = new UsernamePasswordCredentialsProvider("userName", "password");
/**
* 提交本地代码到远端代码仓
*
* @param description 提交说明
* @param proPath 本地git仓路径
* @param file 传输文件
* @param remoteURL 远端git地址https://gitee.com/XXXX/XXXX.git
* @param branch 分支名
*/
public static void CommitCode(String description, String proPath, File file, String remoteURL, String branch) {
Git git = null;
try {
//获取仓库对象
Repository existingRepo = new FileRepositoryBuilder().setGitDir(new File(proPath + "\\.git")).build();
git = new Git(existingRepo);
String workTreePath = git.getRepository().getWorkTree().getCanonicalPath();
log.info("workTreePath" + workTreePath);
String pagePath = file.getCanonicalPath();
log.info("pagePath" + pagePath);
pagePath = pagePath.substring(workTreePath.length());
pagePath = pagePath.replace(File.separatorChar, '/');
if (pagePath.startsWith("/")) {
pagePath = pagePath.substring(1);
}
log.info("the file path is " + pagePath);
git.add().addFilepattern(pagePath).call();//添加文件
log.info("add file success");
SimpleDateFormat ymd = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat hm = new SimpleDateFormat("HHmm");
git.commit().setMessage(description + "_" + ymd.format(new Date()) + "_" + hm.format(new Date())).call();
log.info("commit file success");
git.push()
.setRemote(remoteURL) //设置推送的URL名称
.setRefSpecs(new RefSpec(branch)) //设置需要推送的分支,如果远端没有则创建
.setCredentialsProvider(provider) //身份验证
.call();
log.info("------succeed add,commit,push files . to repository at " + existingRepo.getDirectory());
} catch (Exception e) {
log.error("git提交失败" + e.getMessage());
} finally {
if (git != null) {
git.close();
git.getRepository().close();
}
}
}
三、创建代码仓
/**
* 创建git代码仓
*
* @param localPath 本地文件存储路径
* @param gitUrl 代码仓地址
*/
public static void createRepository(String localPath,String gitUrl) {
Git git=null;
try {
Repository repository = new FileRepository(localPath.concat(".git"));
git = new Git(repository);
// 添加一个 Add-New-File.txt 文件,并向其中写入 Write By Code 字符串
FileUtil.writeString("Write By Code",localPath.concat("Add-New-File.txt"), CharsetUtil.CHARSET_UTF_8);
// 新增的文件添加到存储库,类似于 git add .
git.add().addFilepattern(".").call();
// 添加提交信息,并提交
git.commit().setMessage("code by SST").call();
// 添加远程仓库信息
git.remoteAdd()
.setName("origin")
.setUri(new URIish(gitUrl))
.call();
// 推送到远端 master 分支
git.push()
.setRemote("origin")
.setCredentialsProvider(provider)
.add("master")
.call();
// 关闭 git 命令
git.close();
} catch (IOException | GitAPIException | URISyntaxException e) {
log.error("create repository fail->{}",e.getMessage());
}finally {
if(git!=null){
git.close();
}
}
}