繁体   English   中英

在 Java 中编写 GIT 预提交挂钩?

[英]Write GIT pre-commit hook in java?

我需要用 Java 编写一个 Git 预提交挂钩,它会在实际提交之前检查开发人员提交的代码是否根据特定的eclipse 代码格式化程序格式化,否则拒绝提交。 是否可以用 Java 编写预提交挂钩?

这个想法是调用一个脚本,该脚本又调用您的 java 程序(检查格式)。

你可以在这里看到一个用 python 编写的示例,它调用 java.lang.

try:
    # call checkstyle and print output
    print call(['java', '-jar', checkstyle, '-c', checkstyle_config, '-r', tempdir])
except subprocess.CalledProcessError, ex:
    print ex.output  # print checkstyle messages
    exit(1)
finally:
    # remove temporary directory
    shutil.rmtree(tempdir)

这个另一个例子直接调用ant ,以执行一个 ant 脚本(它又调用一个 Java JUnit 测试套件)

#!/bin/sh

# Run the test suite.
# It will exit with 0 if it everything compiled and tested fine.
ant test
if [ $? -eq 0 ]; then
  exit 0
else
  echo "Building your project or running the tests failed."
  echo "Aborting the commit. Run with --no-verify to ignore."
  exit 1
fi

从 Java 11 开始,您现在可以使用 java 命令运行未编译的主类文件。

$ java Hook.java

如果您使用的是基于 Unix 的操作系统(例如 MacOS 或 Linux),您可以.java并在顶行添加一个 shebang,如下所示:

#!/your/path/to/bin/java --source 11
public class Hook {
    public static void main(String[] args) {
        System.out.println("No committing please.");
        System.exit(1);
    }
} 

然后您可以像处理任何其他脚本文件一样简单地执行它。

$ ./Hook

如果您将文件重命名为pre-commit ,然后将其移动到您的.git/hooks目录中,您现在就有了一个可用的 Java Git Hook。

注意:您可以使用 Cygwin 或 Git Bash 或类似的终端仿真器使其在 Windows 上运行。 然而,shebang 不能很好地处理空间。 我通过将 java 的副本移动到一个没有空格的目录来测试它是否有效并且它工作正常。

是的,你可以用java写一个git hook。

尝试的解决方案

我为我的 commit-msg 钩子尝试了 Rudi 的解决方案:

提交信息文件

#!C:/Progra~1/Java/jdk-17.0.1/bin/java.exe --source 17
#Using Progra~1 to represent "Program Files" as escaping the space
#or surrounding the path in double quotes didn't work for me.
public class Hook {
    public static void main(String[] args) {
        System.out.println("No committing please.");
        System.exit(1);
    }
}

但是我收到了这个错误信息并且很难排除故障

$ git commit -m "Message"
Error: Could not find or load main class .git.hooks.commit-msg
Caused by: java.lang.ClassNotFoundException: /git/hooks/commit-msg

对我有用的解决方案

然后我找到了一个概述另一种方式的来源。

https://dev.to/awwsmm/eliminate-unnecessary-builds-with-git-hooks-in-bash-java-and-scala-517n#writing-a-git-hook-in-java

commit-msg 钩子看起来像这样

#!bin/sh
DIR=$(dirname "$0")
exec java $DIR/commit-msg.java "$@"

这会将 git commit 命令的当前目录 (.git/hooks) 保存到一个变量,以帮助构建 java 文件的路径。 然后 shell 执行带有 java 文件路径的 java 命令和一个包含 COMMIT_EDITMSG 文件路径的参数。

然后你可以将上面定义的 Hook 类移动到它自己的 java 文件中(在本例中为 commit-msg.java)并将其放在 .git/hooks 目录中。

现在你可以运行 git commit -m "Message" 并且 commit-msg 挂钩将阻止提交

您可以使用 shell 可以理解的任何语言编写挂钩,并使用正确配置的解释器(bash、python、perl)等。

但是,为什么不用 java 编写您的 java 代码格式化程序,并从预提交挂钩中调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM