• [仅需一步][org.eclipse.jgit]Java代码操作git命令的步骤...再也不用手写git命令了



    在这里插入图片描述

    1.背景原因

    linux跑了一个需要经常pull代码的java项目…
    每次从gitee拉代码无论是用.sh还是直接命令行都很麻烦而且担心搞错分支…

    2.开源库jgit

    org.eclipse.jgit

    3.上手使用

    pom.xml

    <dependency>
        <groupId>org.eclipse.jgit</groupId>
        <artifactId>org.eclipse.jgit</artifactId>
        <version>5.12.0.202106070339-r</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    application.properties

    # 应用名称
    spring.application.name=mygit2
    # 应用服务 WEB 访问端口
    server.port=10000
    
    # git仓库地址
    GitRepository.Url = https://gitee.com/dongbao126/springboot
    # git分支名称
    GitRepository.BranchName = master
    # git项目名字
    GitRepository.ProjectName = springboot
    # git登录名字
    GitRepository.UserName = XX@XX.com
    # git登录密码
    GitRepository.Password = XXXXXX
    # git本地路径
    GitRepository.LocalRootPath = D:\\my_project
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    GitController.java

    package com.dongtech.mygit2;
    
    import org.eclipse.jgit.api.Git;
    import org.eclipse.jgit.api.PullResult;
    import org.eclipse.jgit.internal.storage.file.FileRepository;
    import org.eclipse.jgit.lib.Repository;
    import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import sun.security.x509.OtherName;
    
    import java.io.File;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Controller
    public class GitController {
        private static final Logger logger = LoggerFactory.getLogger(GitController.class);
        private Git git;
        private Repository localRepo;
    
        @Autowired
        private GitConfig gitConfig;
    
        @RequestMapping("/Git-Sync")
        @ResponseBody
        public String GitSync(){
            logger.info("Git Sync: start..."+getCurrentTime());
            boolean isSuccess = false;
    
            UsernamePasswordCredentialsProvider credentialsProvider = new UsernamePasswordCredentialsProvider(gitConfig.GitUserName,gitConfig.GitPassword);
            try {
                logger.info("============localPath==========" + getLocalPath());
                localRepo = new FileRepository(getLocalPath() + "/.git");
                git = new Git(localRepo);
                File localPathFile = new File(getLocalPath());
                if (!localPathFile.exists()) {
                    Git git = GitClone(gitConfig.GitUrl, gitConfig.GitBranchName, getLocalPath(),credentialsProvider);
                    if (git != null){
                        isSuccess = true;
                    }
                } else {
                    isSuccess = GitPull(gitConfig.GitBranchName,credentialsProvider);
                }
            } catch (Exception e) {
                logger.error(e.getMessage());
                e.printStackTrace();
                logger.info("Git Sync: end..."+getCurrentTime());
                return "git sync failed";
            }finally{
                logger.info("Git Sync: end..."+getCurrentTime());
            }
    
            if (isSuccess)
                return "git sync success";
            return "git sync failed";
        }
    
        /**
         * 获取本地路径
         * @return
         */
        private String getLocalPath(){
            return gitConfig.LocalRootPath + File.separator + gitConfig.GitProjectName;
        }
    
        /**
         * 获取当前时间
         * @return
         */
        private String getCurrentTime(){
            SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
            Date date = new Date(System.currentTimeMillis());
            return formatter.format(date);
        }
    
        /**
         * 执行GitClone
         */
        private Git GitClone(String gitUrl, String branch, String localPath, UsernamePasswordCredentialsProvider credentialsProvider) throws Exception {
            return Git.cloneRepository().setURI(gitUrl).setBranch(branch).setDirectory(new File(localPath)).setCredentialsProvider(credentialsProvider).call();
        }
    
        /**
         * 执行GitPull
         */
        private boolean GitPull(String branch,UsernamePasswordCredentialsProvider credentialsProvider) throws Exception {
            // 强制stash 保证不会冲突
            git.stashCreate();
    
            //TODO 更多命令
            //git.pull();
            //git.add();
            //git.push();
            //git.merge();
    
            PullResult result = git.pull().setRemoteBranchName(branch).setCredentialsProvider(credentialsProvider).call();
            return result.isSuccessful();
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106

    4.运行(windows环境)

    4.1 有java-ide环境

    直接运行
    在这里插入图片描述

    4.2 没有java环境

    如何运行jar文件

    java -jar mygit2-1.0.0.jar
    
    • 1

    在这里插入图片描述

    jar文件

    4.3准备一个需要update的github分支

    本地分支git 落后于 remote分支
    在这里插入图片描述

    4.4直接更新分支

    访问localhost:10000/Git-Sync
    在这里插入图片描述本地分支已被更新至最新

    5.github

    其实这个库支持pull/stash/add/merge/push多种命令的…需要的可以自由摸索…
    github

  • 相关阅读:
    新一代 L1 公链Aptos:安全、可扩展和可升级的Web3基础设施 |Tokenview
    Unity的AB包相关
    Java基于SpringBoot的旅游网站的设计与实现论文
    Pr:首选项 - 媒体缓存
    使用 Django ORM 进行数据库操作
    【无标题】
    集成GPT-4的Cursor智能代码生成器,如何免费使用?
    AI助手-百度免费AI助手工具
    期中考misc复现
    【kali-信息收集】(1.3)探测网络范围:DMitry(域名查询工具)、Scapy(跟踪路由工具)
  • 原文地址:https://blog.csdn.net/aaaadong/article/details/126730887