我目前有一个单一的存储库,其中包含两个项目,每个项目分别位于自己的子文件夹中:一个是C#项目,另一个是Javascript项目。我想要一个pre-commit钩子,它仅在任何暂存文件来自Javascript文件夹时运行jshint。如果暂存文件仅来自C#文件夹,则不会运行pre-commit钩子。
这是否可能?还是我的唯一解决方案是将两个项目拆分为它们自己的存储库?
我目前有一个单一的存储库,其中包含两个项目,每个项目分别位于自己的子文件夹中:一个是C#项目,另一个是Javascript项目。我想要一个pre-commit钩子,它仅在任何暂存文件来自Javascript文件夹时运行jshint。如果暂存文件仅来自C#文件夹,则不会运行pre-commit钩子。
这是否可能?还是我的唯一解决方案是将两个项目拆分为它们自己的存储库?
如果您使用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/
$
可能会让一些人感到困惑。在我注意到这一点之前,我调试了很长时间。 - MindTooth这里有很好的本地解决方案。
我使用类似于这样的东西
if git diff --cached --quiet -- "frontend/"
then
echo "Unchanged"
exit 0
else
echo "Changed"
fi
exclude: '^(?!javascript/)'
请查看文档此处
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
Git钩子是Git在执行特定操作之前或之后运行的脚本。
如果你编写了一个脚本并将其保存为<repository_name>/.git/hooks/pre-commit
,那么Git将在提交之前运行它。因此,为您正在使用的操作系统编写一个简单的脚本,针对该子文件夹运行jshint,并将其保存到该路径中。
Git不会使用任何参数运行您的pre-commit hook。您可以使用git命令来确定您的存储库的状态(作为提交的一部分添加的更改仍然只是已暂存和可通过--cached访问)。如果您进行任何更改并希望它们成为提交的一部分,则需要在脚本退出之前添加它们。
由于您正在使用C#,因此应该知道Windows上的git钩子有些棘手:在Windows上执行Git钩子