Git预提交钩子仅适用于特定子文件夹?

44

我目前有一个单一的存储库,其中包含两个项目,每个项目分别位于自己的子文件夹中:一个是C#项目,另一个是Javascript项目。我想要一个pre-commit钩子,它仅在任何暂存文件来自Javascript文件夹时运行jshint。如果暂存文件仅来自C#文件夹,则不会运行pre-commit钩子。

这是否可能?还是我的唯一解决方案是将两个项目拆分为它们自己的存储库?


代码库是如何划分的?每个项目都有一个分支吗? - ôkio
这里也有同样的问题。我们在同一个git仓库中每个目录都有一个独立的项目,如果我要提交一个目录,我只想运行该目录的测试。 - nurettin
我写了一个小工具https://pypi.org/project/hooks4git/来帮助处理Git钩子。虽然它不受直接支持,您可以在其配置文件中调用自定义脚本来解决您的问题。但是这个工具很容易升级以支持此功能。我喜欢这个想法,并在那里创建了一个问题:https://github.com/lovato/hooks4git/issues/23 - Lovato
5个回答

31

如果您使用pre-commit,可以指定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
也许可以加一个小提示,说明多行模式仅适用于文件。末尾的 $ 可能会让一些人感到困惑。在我注意到这一点之前,我调试了很长时间。 - MindTooth
我该如何选择两个文件夹? - Dr_Zaszuś
2
你应该如何处理这个YAML代码?Precommit钩子只是sh/cmd脚本,那么你应该在哪里使用它? - jnovacho
这个YAML文件用于https://pre-commit.com/。 - Igor
预提交是一个bash脚本,用于展示一个带有yaml示例的原因。 - godhar

4

这里有很好的本地解决方案。

我使用类似于这样的东西

if git diff --cached --quiet -- "frontend/"
then
  echo "Unchanged"
  exit 0
else
  echo "Changed"
fi

2
如果您使用的是比v1.1.0更新的pre-commit版本,则可以在位于代码库根目录的.pre-commit-config.yaml中添加一个exclude字段。就像下面这样:
exclude: '^(?!javascript/)'

请查看文档此处


1
这个能否仅包含特定文件夹? - baxx

1
你可以使用 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

-1

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

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

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

由于您正在使用C#,因此应该知道Windows上的git钩子有些棘手:在Windows上执行Git钩子


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接