[英]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.