如何防止使用 git 挂钩提交文件 (.json)?

How can I prevent a file (.json) to be commited with a git hook?

如何防止文件 (.json) 被 git 挂钩提交?

我有一个 .json 在服务器上。所以我不能使用 git 忽略。但是现在我不想让任何人更改(提交)这个文件,因为它会破坏某些东西。我想使用本地挂钩。

我怎样才能在提交中获得特殊文件?

你能告诉我如何实现这个吗?

感谢您的帮助。

一个pre-commit样本:

#!/bin/bash

ipath="foo/bar.json"
git diff --cached --name-only | if grep -qE "^$ipath$";then
    git reset HEAD -- "$ipath"
    echo "Warning: $ipath is removed from the index. It's not allowed to be committed."
fi

git diff --cached --name-only 列出所有将要提交的更改文件。如果在列表中找到 foo/bar.json,则 git reset HEAD -- foo/bar.json 将其从索引中删除,这样它就不会提交,而是留在工作树中。

它很适合你。但是,您不能确保它对其他人也适用。例如,其他贡献者可能会从他们的本地存储库中删除它。您需要的是中央存储库中的 pre-receive 挂钩,即服务器端的挂钩。如果传入提交触及 foo/bar.json.

,它会拒绝任何推送

一个pre-receive样本:

#!/bin/bash

ipath="foo/bar.json"
zero="0000000000000000000000000000000000000000"

while read old new name;do
    if [ "$zero" == "$old" ];then
        #creating new ref, do something here
        continue
    fi

    if [ "$zero" == "$new" ];then
        #deleting a ref, do something here
        continue
    fi

    #updating a ref, check if the incoming commits touch `foo/bar.json`
    git diff $old..$new --name-only | if grep -qE "^$ipath$";then
        c=$(git log $old..$new --pretty=%H -- $ipath)
        echo "Error: $ipath is changed in:"
        echo $c
        echo "Error: $ipath is not allowed to be committed and pushed."
        exit 1
    fi
done

贡献者在git push后收到错误信息。在再次尝试之前,他们必须修改他们的提交并删除 foo/bar.json 的更改。 pre-receive中需要处理deleting a refcreating a ref