5

我有一个跟踪几个配置文件的 git 存储库。其中一个配置文件是纯文本,而另一个是 gpg 加密的。它们是这样命名的。

  • myconfig.yaml
  • myconfig.yaml.gpg

我想在 git 中创建一个服务器端挂钩,以确保任何以 .gpg 结尾的文件的任何版本都不会以纯文本形式提交。

我认为最好有一个客户端钩子和一个服务器端钩子,以防止开发人员进行大量更改,然后在尝试将更改向上推时陷入困境,因为 gpg 文件的历史包含未加密的数据。

我不能在提交/克隆期间简单地加密/解密 gpg 文件,因为有些人不应该有权解密文件。

我不确定如何完成确保所有版本的 .gpg 文件中仅包含加密数据的任务。有任何想法吗?

4

1 回答 1

6

您可以使用该file命令检查文件并自动确定它的类型。例如:

$ file foo.gpg
foo.gpg: GPG encrypted data
$ file foo
foo: ASCII text

你可以在一个钩子中匹配这个。就像是:

case "$filename" in
  *.gpg) if [ "$(file -b "$filename")" != "GPG encrypted data" ]; then
             echo "Error: $filename should be encrypted but isn't" >&2
             exit 1
         fi
         ;;
esac

对于客户端挂钩,您可以使用预提交挂钩git diff --cached --name-only来获取要检查的名称列表。

服务器端的钩子更难。我认为您可以挂上预接收,将建议的参考检查到一个临时位置,验证它们(可能git diff --name-only HEAD^用于获取已修改文件的列表),然后如果它违反了您的要求,则拒绝从那里更新。

于 2013-01-08T23:59:27.833 回答