最近项目中要做一个回滚功能,目的是如果这次发布出现了问题,立马回滚到上一次发布的版本,用jgit实现的,具体方法如下:
public class GitUtil {
private final static String GIT = ".git";
/**
* 将文件列表提交到git仓库中
* @param gitRoot git仓库目录
* @param files 需要提交的文件列表
* @return 返回本次提交的版本号
* @throws IOException
*/
public static String commitToGitRepository(String gitRoot, List<String> files) throws Exception {
if (StringUtils.isNotBlank(gitRoot) && files != null && files.size() > 0) {
File rootDir = new File(gitRoot);
//初始化git仓库
if (new File(gitRoot + File.separator + GIT).exists() == false) {
Git.init().setDirectory(rootDir).call();
}
//打开git仓库
Git git = Git.open(rootDir);
//判断是否有被修改过的文件
List<DiffEntry> diffEntries = git.diff()
.setPathFilter(PathFilterGroup.createFromStrings(files))
.setShowNameAndStatusOnly(true).call();
if (diffEntries == null || diffEntries.size() == 0) {
throw new Exception("提交的文件内容都没有被修改,不能提交");
}
//被修改过的文件
List<String> updateFiles=new ArrayList<String>();
ChangeType changeType;
for(DiffEntry entry : diffEntries){
changeType = entry.getChangeType();
switch (changeType) {
case ADD:
updateFiles.add(entry.getNewPath());
break;
case COPY:
updateFiles.add(entry.getNewPath());
break;
case DELETE:
updateFiles.add(entry.getOldPath());
break;
case MODIFY:
updateFiles.add(entry.getOldPath());
break;
case RENAME:
updateFiles.add(entry.getNewPath());
break;
}
}
//将文件提交到git仓库中,并返回本次提交的版本号
AddCommand addCmd = git.add();
for (String file : updateFiles) {
addCmd.addFilepattern(file);
}
addCmd.call();
CommitCommand commitCmd = git.commit();
for (String file : updateFiles) {
commitCmd.setOnly(file);
}
RevCommit revCommit = commitCmd.setCommitter(Constants.USERNAME, Constants.EMAIL)
.setMessage("publish").call();
return revCommit.getName();
}
return null;
}
/**
* 将git仓库内容回滚到指定版本的上一个版本
* @param gitRoot 仓库目录
* @param revision 指定的版本号
* @return true,回滚成功,否则flase
* @throws IOException
*/
public static boolean rollBackPreRevision(String gitRoot, String revision) throws IOException {
Git git = Git.open(new File(gitRoot));
Repository repository = git.getRepository();
RevWalk walk = new RevWalk(repository);
ObjectId objId = repository.resolve(revision);
RevCommit revCommit = walk.parseCommit(objId);
String preVision = revCommit.getParent(0).getName();
git.reset().setMode(ResetType.HARD).setRef(preVision).call();
repository.close();
return true;
}
/**
* 查询本次提交的日志
* @param gitRoot git仓库
* @param revision 版本号
* @return
* @throws Exception
*/
public static List<DiffEntry> getLog(String gitRoot, String revision) throws Exception {
Git git = Git.open(new File(gitRoot));
Repository repository = git.getRepository();
ObjectId objId = repository.resolve(revision);
Iterable<RevCommit> allCommitsLater = git.log().add(objId).call();
Iterator<RevCommit> iter = allCommitsLater.iterator();
RevCommit commit = iter.next();
TreeWalk tw = new TreeWalk(repository);
tw.addTree(commit.getTree());
commit = iter.next();
if (commit != null)
tw.addTree(commit.getTree());
else
return null;
tw.setRecursive(true);
RenameDetector rd = new RenameDetector(repository);
rd.addAll(DiffEntry.scan(tw));
return rd.compute();
}
}
也是刚接触jgit不久,可能里面有些bug,若发现,请指出,谢谢!!
分享到:
相关推荐
JGit工具类,giylabapi操作,认证 push, pull 等
赠送jar包:org.eclipse.jgit-5.10.0.202012080955-r.jar; 赠送原API文档:org.eclipse.jgit-5.10.0.202012080955-r-javadoc.jar; 赠送源代码:org.eclipse.jgit-5.10.0.202012080955-r-sources.jar; 赠送Maven...
jgit jar&docjgit;
赠送jar包:org.eclipse.jgit.lfs-5.10.0.202012080955-r.jar; 赠送原API文档:org.eclipse.jgit.lfs-5.10.0.202012080955-r-javadoc.jar; 赠送源代码:org.eclipse.jgit.lfs-5.10.0.202012080955-r-sources.jar;...
JGit是一个可以用java来对git进行操作的插件,可以通过代码连接git远程仓库,在本地建立版本库,进行拉取、提交、推送等操作。使用时添加pom依赖 <groupId>org.eclipse.jgit <artifactId>org.eclipse.jgit ...
赠送jar包:org.eclipse.jgit-5.10.0.202012080955-r.jar; 赠送原API文档:org.eclipse.jgit-5.10.0.202012080955-r-javadoc.jar; 赠送源代码:org.eclipse.jgit-5.10.0.202012080955-r-sources.jar; 赠送Maven...
JGit 是提供了一套类似 Git 命令的 Java API,可以方便地在程序中进行 git 操作 jgit-4.8.0.201706111038-r.jar
silly-jgit 是 Git 核心库的纯 Java 实现。 标签:silly
jgit-cookbook, 提供 JGit Java Git实现的示例和代码 Fragment jgit食谱 提供 JGit的Java Git实现示例和代码 Fragment 。JGit框架丰富多样,它有两层,一个低级的插件 api,以及一个高级别的系列的命令,比如 ...
赠送jar包:org.eclipse.jgit.lfs-5.10.0.202012080955-r.jar; 赠送原API文档:org.eclipse.jgit.lfs-5.10.0.202012080955-r-javadoc.jar; 赠送源代码:org.eclipse.jgit.lfs-5.10.0.202012080955-r-sources.jar;...
JGit 是提供了一套类似 Git 命令的 Java API,可以方便地在程序中进行 git 操作
matlab开发-JGit4MATLAB。jgit4matlab是jgit在matlab中的包装器。它是从matlab命令窗口中使用的。
org.eclipse.jgit-4.5.0.201609210915-r.jar 通过java执行git命令
JGit可以直接导入Eclipse,并从那里构建和测试。 可以使用或从命令行构建它。 CI使用Maven构建并在运行。 org.eclipse.jgit 可以独立运行的纯Java库,没有其他支持库。 它提供了一些类来读取和写入Git存储库并在...
该项目试图提供一个现成的代码片段集合,这些片段为使用JGit构建功能提供了快速入门。 请确保阅读精美的,并使用现有的和《 ,因为它们做得很好,分别提供了JGit的详细信息和概述。 注意:请使用诸如网站来获取有关...
注意:如果您不打算签署提交,则可以排除org.eclipse.jgit/org.eclipse.jgit.gpg.bc ,即针对lein: :dependencies [[clj-jgit "1.x.x" :exclusions [org.eclipse.jgit/org.eclipse.jgit.gpg.bc]]] 快速入门教程 ...
scala-amazon-queue.zip,使用amazon sqs处理amazon s3中文件的客户端代码使用amazonsqs处理amazons3中文件的客户端代码
jgit-实验学习 JGit
maven-jgit-buildnumber-plugin-1.2.6.jar