繁体   English   中英

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

[英]Git pre-commit hooks only for a specific subfolder?

我目前有一个包含两个项目的回购协议,每个项目都在自己的子文件夹中:一个在 C# 中,一个在 Javascript 中。我想要一个预提交挂钩,它将运行 jshint,但前提是任何暂存文件都在 Javascript 文件夹中如果暂存文件仅来自 C# 文件夹,则预提交挂钩将不会运行。

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

指定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/

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

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

我用这样的东西

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

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

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

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

您正在使用 C#,因此您应该意识到 Windows 上的 git hooks 有点古怪: Executing Git hooks on Windows

如果您使用比 v1.1.0 更新的预提交,那么您可以向位于存储库根文件夹中的.pre-commit-config.yaml添加一个exclude字段。

就像下面一样:

exclude: '^(?!javascript/)'

此处检查文档

暂无
暂无

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

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