簡體   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