执行git的fetch命令 Process process = Runtime.getRuntime().exec(new String[]{ "git", "fetch", "--all" }, new String[]{}, file); int code = process.waitFor(); if (code != 0) { StringBuilder stringBuilder = new StringBuilder().append("\ng
Process process = Runtime.getRuntime().exec(new String[]{ "git", "fetch", "--all" }, new String[]{}, file); int code = process.waitFor(); if (code != 0) { StringBuilder stringBuilder = new StringBuilder().append("\ngit fetch fail: path=").append(file.getAbsolutePath()) .append(",command=git fetch -all\n"); Scanner scanner = new Scanner(process.getErrorStream(), SHELL_CHARSET); while (scanner.hasNextLine()) { stringBuilder.append(scanner.nextLine()).append("\n"); } logger.error(stringBuilder.toString()); logger.error(String.format("git fetch fail: %s", file.getAbsolutePath())); }构造命令字符串
private static final boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("windows"); private static final String GIT_CMD = "git"; private static final String SHELL_CHARSET; static { if (IS_WINDOWS) { SHELL_CHARSET = "GBK"; } else { String lang = System.getenv("LANG"); if (StringUtils.isNotBlank(lang)) { if (lang.contains(".")) { SHELL_CHARSET = lang.substring(lang.indexOf(".") + 1); } else { SHELL_CHARSET = lang; } } else { SHELL_CHARSET = System.getProperty("file.encoding", "UTF-8"); } } } private String buildCommand(String[] cmdArray) { StringBuilder builder = new StringBuilder(); if (IS_WINDOWS) { builder.append("cmd /c \""); } for (int i = 0; i < cmdArray.length; i++) { if (i != 0) { builder.append(" && "); } builder.append(cmdArray[i]); } if (IS_WINDOWS) { builder.append(" \""); } return builder.toString(); }执行git的merge(将tag merge到branch)
String command = buildCommand(new String[] { String.format("%s checkout %s", GIT_CMD, branchName), String.format("%s pull", GIT_CMD), String.format("%s merge -s recursive -X theirs %s", GIT_CMD, tagName), String.format("%s push origin %s -q", GIT_CMD, branchName) }); long time = System.currentTimeMillis(); Process process = Runtime.getRuntime().exec(command, null, dir); int code = process.waitFor(); if (code != 0) { StringBuilder stringBuilder = new StringBuilder().append("\ngit merge fail: gitPath=").append(gitPath) .append(",dir=").append(dir.getAbsolutePath()) .append(",command=").append(command).append("\n"); Scanner scanner = new Scanner(process.getErrorStream(), SHELL_CHARSET); while (scanner.hasNextLine()) { stringBuilder.append(scanner.nextLine()).append("\n"); } logger.error(stringBuilder.toString()); throw new RuntimeException("git merge fail"); }执行git的clone
String[] cmdArray = new String[]{ "git", "clone", gitPath, dir.getName(), "-q"}; long time = System.currentTimeMillis(); Process process = Runtime.getRuntime().exec(cmdArray, new String[]{}, dir.getAbsoluteFile().getParentFile()); int code = process.waitFor(); if (code != 0) { StringBuilder stringBuilder = new StringBuilder().append("\ngit clone fail: gitPath=").append(gitPath) .append(",dir=").append(dir.getParentFile().getAbsolutePath()) .append(",command=").append(StringUtils.join(cmdArray, " ")).append("\n"); Scanner scanner = new Scanner(process.getErrorStream(), SHELL_CHARSET); while (scanner.hasNextLine()) { stringBuilder.append(scanner.nextLine()).append("\n"); } logger.error(stringBuilder.toString()); throw new RuntimeException("git clone fail"); }按commit hash来打tag、按branch上的HEAD来打tag、按tag来打tag
@Value("${git.repository.dir}") private String gitDir; /** * 按commit hash来打tag */ public void tagByCommitHash(String gitPath, String branchName, String commitHash, String tagNameNew) throws Exception { tagByRef(gitPath, branchName, commitHash, tagNameNew); } /** * 按branch上的HEAD来打tag */ public void tagByBranchName(String gitPath, String branchName, String tagNameNew) throws Exception { tagByRef(gitPath, branchName, "remotes/origin/" + branchName, tagNameNew); } /** * 按tag来打tag */ public void tagByTagName(String gitPath, String branchName, String tagNameOld, String tagNameNew) throws Exception { tagByRef(gitPath, branchName, tagNameOld, tagNameNew); } private void tagByRef(String gitPath, String branchName, String tagRef, String tagNameNew) throws Exception { File dir = new File(gitDir, DigestUtils.md5DigestAsHex(gitPath.getBytes(StandardCharsets.UTF_8))); ReentrantLock lock = getLock(dir.getAbsolutePath()); try { lock.lock(); ensureGitWorkDir(gitPath, dir); String command = buildCommand(new String[] { String.format("%s tag %s %s", GIT_CMD, tagNameNew, tagRef), String.format("%s push origin %s", GIT_CMD, tagNameNew) }); long time = System.currentTimeMillis(); Process process = Runtime.getRuntime().exec(command, null, dir); int code = process.waitFor(); if (code != 0) { StringBuilder stringBuilder = new StringBuilder().append("\ngit merge fail: gitPath=").append(gitPath) .append(",dir=").append(dir.getAbsolutePath()) .append(",command=").append(command).append("\n"); Scanner scanner = new Scanner(process.getErrorStream(), SHELL_CHARSET); while (scanner.hasNextLine()) { stringBuilder.append(scanner.nextLine()).append("\n"); } logger.error(stringBuilder.toString()); throw new RuntimeException("git tag fail"); } logger.info("================tagByRef time ms:" + (System.currentTimeMillis() - time)); } finally { lock.unlock(); } }