9

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

4

3 回答 3

7

这个想法是调用一个脚本,然后调用你的java程序(检查格式)。

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

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
于 2012-11-06T07:41:29.020 回答
2

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

$ java Hook.java

如果您像这样剥离.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。

于 2020-05-19T19:32:23.810 回答
1

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

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

于 2012-11-06T07:27:11.623 回答