Git预提交钩子只用于特定的子文件夹?

6g8kf2rb  于 2023-01-15  发布在  Git
关注(0)|答案(5)|浏览(171)

我目前有一个包含两个项目的单一存储库,每个项目都在自己的子文件夹中:一个用C#,一个用Javascript,我想有一个pre-commit钩子运行jshint,但只有当暂存文件在Javascript文件夹中时如果暂存文件只来自C#文件夹,那么pre-commit钩子就不会运行.
这有可能吗?或者我唯一的解决办法是把这两个项目分成他们自己的回购协议?

ha5z0ras

ha5z0ras1#

如果您使用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/
h9a6wy2h

h9a6wy2h2#

Here是很好的本机解决方案。
我用这样的东西

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

sauutmhj3#

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

vdgimpew4#

如果您使用的是比v1.1.0更新的pre-commit,那么您可以在位于repo根文件夹中的.pre-commit-config.yaml中添加一个exclude字段。
如下所示:

exclude: '^(?!javascript/)'

在此查看文档

nimxete2

nimxete25#

Git钩子是Git在执行特定操作之前或之后运行的脚本。
如果你写了一个脚本并保存为<repository_name>/.git/hooks/pre-commit,那么git会在提交前运行它,所以为你正在使用的操作系统写一个简单的脚本,在那个子文件夹上运行jshint,并保存到那个路径。
Git不会使用任何参数来运行pre-commit钩子,你可以使用git命令来判断仓库的状态(作为commit的一部分添加的更改仍然只是暂存,并可以通过--cached访问)。如果你做了任何更改,并希望它们成为commit的一部分,你需要在脚本退出之前添加它们。
你正在使用C#,所以你应该意识到git钩子在windows上有点古怪:Executing Git hooks on Windows

相关问题