Jgit管理设置Gitlab中的submodule

        最近将gitlab中的submodule管理由shell脚本转换为api调用。在网络上找了相关信息(包括官网),上面的使用方式都比较片面。参照样例及探索验证后将完整的使用过程进行记录。以方便他人借鉴。

shell脚本处理方式如下

1、编制shell脚本,内容如下

#!/bin/sh

#源地址
URL_SRC=$1
echo "Source url: $URL_SRC"

#目标地址
URL_DEST=$2
echo "Dest url: $URL_DEST"

# 初始化配置代理项目
function init() {
  /usr/local/git/bin/git clone $URL_DEST
}

# 增加设置子模块
function doProxy() {
  # 进入proxy文件夹
  cd proxy

  # 添加代理子模块
  /usr/local/git/bin/git submodule add $URL_SRC

  # 提交
  /usr/local/git/bin/git commit -m "add submodules $URL_SRC to $URL_DEST"

  # 提交gitlab
  /usr/local/git/bin/git push
}

# 删除配置代理项目proxy文件
function deleteProxyDir(){
  # 为了减少不必要麻烦(fatal: 不是 git 仓库(或者直至挂载点 / 的任何父目录)停止在文件系统边界(未设置 GIT_DISCOVERY_ACROSS_FILESYSTEM))
  # 当次执行完成后清理proxy文件夹
  cd ..
  # 删除proxy文件
  rm -rf proxy
}

# 1.初始化(获取配置代理项目)
init;

# 2.作业(新增配置项目到代理项目)
doProxy;

# 3.清除proxy目录
deleteProxyDir;

exit 0

2、可以直接执行shell脚本,传递相应参数执行即可。(我们是在java代码中执行脚本)在代码中使用方法

private void addProxyConfigRepostory(Project configProject){
String execFile = "/shell/to/execute/proxy.sh";
String configRepostory = configProject.getHttpUrlToRepo();

        String proxyRepostory = configRepostory.substring(0, configRepostory.lastIndexOf(CommonsConstants.PATH_SEPARATOR)+1)
            .concat("proxy.git");

        ProcessBuilder pb = new ProcessBuilder(execFile, configRepostory, proxyRepostory);
        int lastIndex = execFile.lastIndexOf(CommonsConstants.PATH_SEPARATOR);
        String directory = "";
        if (lastIndex != -1) {
            directory = execFile.substring(0, lastIndex);
        }

        pb.directory(new File(directory));
        try {
            Process process = pb.start();
            int waitF = process.waitFor();
            if (waitF == 0) {
                log.info("脚本执行成功");
            }else{
                log.warn("脚本执行失败");
            }
        } catch (Exception e) {
            log.error("脚本执行异常,{0}", e);
        }
}

这种方式的弊端是需要安装git客户端程序,为了解决此弊端采用jgit实现。

jgit的好处是不需要安装git客户端程序,由代码完成submodule的维护。使用步骤如下

1、引入jgit(如是maven项目,直接在pom.xml里引入即可,普调java工程则需引入jgit相应的jar)

<dependency>
      <groupId>org.eclipse.jgit</groupId>
      <artifactId>org.eclipse.jgit</artifactId>
      <version>5.9.0.202009080501-r</version>
    </dependency>

2、代码中实现

private static void init() {
        String projectName = "validation-config-repo-012";  // submodule项目名
        File tempDirectory = new File("/tmp/bone-provider/config/submodules");// 临时路径
        String gitlabUri = "http://{gitlab-hostname}[{:port}]/{group-path}"; // gitlab地址
        String userName = "{user-name}"; // gitlab账号
        String password = "{user-passwd}"; // gitlab账号密码
        CredentialsProvider credentialsProvider = new UsernamePasswordCredentialsProvider(userName, password);
        try {
            Git git;
            if (tempDirectory.exists()) {
                // 临时目录存在,则直接使用,不需要重新clone
                git = Git.open(tempDirectory);
            } else {
                // 不存在,则需要clone到临时目录(可以不clone项目中的submodules相关文件)
                git = Git.cloneRepository()
                    .setURI(gitlabUri + "/proxy.git")
                    .setCredentialsProvider(credentialsProvider)
                    .setBranch("master")
                    // .setCloneSubmodules(true) // 需要submodule文件则需要设置此项为true,默认不克隆拉取submodule中的文件
                    .setDirectory(tempDirectory)
                    .call();
            }

            // 更新临时目录中的submodule信息
            git.submoduleUpdate()
                .setCredentialsProvider(credentialsProvider)
                .call();

            // 添加submodule信息
            git.submoduleAdd().setName(projectName)
                .setURI(gitlabUri + "/" + projectName + ".git")
                .setPath(projectName)
                .setCredentialsProvider(credentialsProvider)
                .call();

            //提交
            CommitCommand commitCommand = git.commit()
                .setCommitter(userName, "administor@banksteel.com")
                .setMessage("add submodules " + projectName + ".git to proxy.git");
            commitCommand.setCredentialsProvider(credentialsProvider);
            commitCommand.call();

            //push
            git.push()
                .setCredentialsProvider(credentialsProvider)
                .call();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

这样就完成通过jgit完成对submodule的新增管理,删除和更新类似,这里就不赘述。

JGit,merge方法用于将一个分支的更改合并到另一个分支。在进行合并时,可以设置个人信息以标识合并的作者和提交者。 要设置个人信息,可以使用`PersonIdent`类来表示作者和提交者的身份信息。`PersonIdent`类包含姓名和电子邮件地址等属性。 下面是一个示例代码,展示了如何使用merge方法并设置个人信息: ```java import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.MergeCommand; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.merge.MergeStrategy; public class JGitMergeExample { public static void main(String[] args) { try { // 打开Git仓库 Git git = Git.open(new File("/path/to/repository")); // 设置作者和提交者的个人信息 PersonIdent author = new PersonIdent("Author Name", "author@example.com"); PersonIdent committer = new PersonIdent("Committer Name", "committer@example.com"); // 执行合并操作 git.merge() .setStrategy(MergeStrategy.RESOLVE) // 设置合并策略 .setFastForward(MergeCommand.FastForwardMode.NO_FF) // 禁用快进合并 .setAuthor(author) // 设置作者信息 .setCommitter(committer) // 设置提交者信息 .include(git.getRepository().resolve("branch-to-merge")) // 指定要合并的分支 .call(); System.out.println("Merge completed successfully."); } catch (Exception e) { System.out.println("Merge failed: " + e.getMessage()); } } } ``` 请注意,上述示例的`/path/to/repository`应替换为实际的Git仓库路径,`branch-to-merge`应替换为要合并的分支名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值