`

JGit的常用功能(提交、回滚,日志查询)

    博客分类:
  • git
阅读更多

最近项目中要做一个回滚功能,目的是如果这次发布出现了问题,立马回滚到上一次发布的版本,用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,若发现,请指出,谢谢!!

0
2
分享到:
评论
1 楼 荣仔521 2013-03-01  
写的太好了

相关推荐

    jgit jar&doc;

    JGit是Java实现的一个分布式版本控制系统,它提供了一个命令行接口和API,使得开发者可以在Java应用程序中集成版本控制功能。这个压缩包包含了JGit的主要库文件以及相关的文档资源。 首先,我们关注`org.eclipse....

    JGit工具类包 超全 可用

    综上所述,这个"JGit工具类包"提供了一整套的Git操作功能,涵盖了从基本的仓库管理和版本控制到复杂的GitLab API交互,对于开发Java应用尤其是需要集成Git功能的应用非常有用。`giylabapi`和递归操作的特性使得它在...

    Java操作GitLab工具JGit 工具类

    JGit是一个可以用java来对git进行操作的插件,可以通过代码连接git远程仓库,在本地建立版本库,进行拉取、提交、推送等操作。使用时添加pom依赖 &lt;groupId&gt;org.eclipse.jgit &lt;artifactId&gt;org.eclipse.jgit ...

    matlab开发-JGit4MATLAB

    将JGit与MATLAB结合,意味着MATLAB用户可以方便地在编程环境中执行Git的版本控制任务,如克隆、提交、拉取、合并等。 描述中提到,“jgit4matlab是jgit在matlab中的包装器”,这表明存在一个MATLAB接口或类库,使得...

    org.eclipse.jgit-5.10.0.202012080955-r-API文档-中文版.zip

    赠送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...

    org.eclipse.jgit-3.0.0.201306101825-r.zip

    Eclipse JGit是一款用Java编写的轻量级、纯Java库,它实现了Git版本控制系统的主要功能,使得在Java环境中可以进行Git操作,如克隆、提交、分支管理和合并等。 【描述】"scala-amazon-queue.zip" 提供了一组Scala...

    jgit jar包

    org.eclipse.jgit-4.5.0.201609210915-r.jar 通过java执行git命令

    org.eclipse.jgit.lfs-5.10.0.202012080955-r-API文档-中文版.zip

    赠送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;...

    org.eclipse.jgit-5.10.0.202012080955-r-API文档-中英对照版.zip

    赠送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 Java Git实现的示例和代码片段.zip

    在实际开发中,JGit的一个常见应用场景是在Java Web应用中集成版本控制功能,例如,用户可以通过Web界面提交代码,而服务端使用JGit处理这些提交,同步到远程仓库。另一个应用场景是在服务器端实现自动化代码部署,...

    silly-jgit.zip

    silly-jgit 是 Git 核心库的纯 Java 实现。 标签:silly

    jgit-4.8-jar包

    JGit 是提供了一套类似 Git 命令的 Java API,可以方便地在程序中进行 git 操作 jgit-4.8.0.201706111038-r.jar

    jgit-cookbook, 提供 JGit Java Git实现的示例和代码 Fragment.zip

    jgit-cookbook, 提供 JGit Java Git实现的示例和代码 Fragment jgit食谱 提供 JGit的Java Git实现示例和代码 Fragment 。JGit框架丰富多样,它有两层,一个低级的插件 api,以及一个高级别的系列的命令,比如 ...

    org.eclipse.jgit-4.9.0.201710071750-r.jar

    JGit 是提供了一套类似 Git 命令的 Java API,可以方便地在程序中进行 git 操作

    org.eclipse.jgit.pgm-3.2.0.0.2-UNOFFICIAL-ROBERTO-RELEASE.zip

    3. **提交历史**:查询提交历史,获取特定提交的信息。 4. **差异计算**:比较文件或目录在不同版本之间的变化。 5. **标签管理**:添加、删除和查询Git标签。 6. **索引和工作树**:管理Git的工作树和索引,执行暂...

    org.eclipse.jgit.lfs-5.10.0.202012080955-r-API文档-中英对照版.zip

    赠送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-experiment:学习 JGit

    JGit 是一个用 Java 编写的轻量级、纯Java实现的版本控制系统,它提供了与Git类似的功能,可以在没有Git原生支持的环境中使用。在本文中,我们将深入探讨JGit的基本概念、核心功能以及如何在Java项目中使用它。 **...

    org.eclipse.jgit.junit.http-2.99.99.1.0-UNOFFICIAL-ROBERTO-RELEASE.zip

    Eclipse JGit是一个用Java编写的轻量级、纯Java库,用于处理Git版本控制系统。这个特定的版本可能是开发者的非官方测试构建,版本号2.99.99.1.0表明它可能是一个非常规版本,用于测试或实验目的,由名为ROBERTO的...

    org.eclipse.jgit.ant-3.3.2.201404171909-r.zip

    Ant是Apache的一款构建工具,而JGit的Ant任务库则允许开发者在Ant构建脚本中直接使用JGit的功能,比如克隆、提交、拉取和分支管理等。这对于自动化构建流程非常有用,特别是对于那些依赖于Git版本控制的Java项目。 ...

Global site tag (gtag.js) - Google Analytics