仅针对特定子文件夹的Git预提交挂钩?

时间:2014-10-14 20:47:35

标签: git hook pre-commit

我目前只有一个包含两个项目的repo,每个项目都在自己的子文件夹中:一个在C#中,另一个在Javascript中。我希望有一个预提交钩子,它将运行jshint但是只有当任何暂存文件在Javascript文件夹中时如果暂存文件只来自C#文件夹,那么预提交钩子就不会运行。

这有可能吗?或者是我将这两个项目拆分成自己的回购的唯一解决方案?

4 个答案:

答案 0 :(得分:2)

指定files包括(或排除exclude)特定目录,例如仅在my_dir中运行钩子:

files: ^my_dir/
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    hooks:
        ...

或在my_dir内的任何地方运行:

exclude: ^my_dir/
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    hooks:
        ...

如果排除清单很长,请使用详细的正则表达式:

exclude: >
  (?x)^(
      path/to/file1.py|
      path/to/file2.py|
      path/to/file3.py
  )$

您也可以仅将它们应用于特定的钩子,只需执行以下操作:

-   id: my-hook
    exclude: ^my_dir/

答案 1 :(得分:0)

Git挂钩是Git在执行特定操作之前或之后运行的脚本。

如果你编写一个脚本并将其保存为<repository_name>/.git/hooks/pre-commit,那么git会在提交前运行它。因此,为您正在使用的操作系统编写一个简单的脚本,该脚本对该子文件夹运行jshint并将其保存到该路径。

Git没有使用任何参数运行预提交钩子。您可以使用git命令来确定存储库的状态(作为提交的一部分添加的更改仍然只是暂存并可通过--cached访问)。如果您进行任何更改并希望它们成为提交的一部分,则您需要在脚本退出之前添加它们。

你正在使用C#,所以你应该知道windows上的git钩子有点古怪:Executing Git hooks on Windows

答案 2 :(得分:0)

您可以使用git log来查找子目录中的最新提交是否与存储库根目录中的最新提交相匹配:

#!/bin/env bash

function get_commit {
    git log --oneline -- $1 | head -n 1 | cut -d " " -f1
}

ROOT_COMMIT=$(get_commit)
SUBDIR_COMMIT=$(get_commit my/subdir/path)

if [ "$SUBDIR_COMMIT" == "$ROOT_COMMIT" ]; then
    # do pre-commit hook stuff here
fi

答案 3 :(得分:0)

如果您使用的是高于v1.1.0的预提交,则可以将exclude字段添加到位于仓库的根文件夹中的.pre-commit-config.yaml中。

就像下面这样:

exclude: '^(?!javascript/)'

检查文档here