有没有办法测试文件是否在git钩子中加密GPG?

时间:2013-01-08 21:33:24

标签: git gnupg

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

  • myconfig.yaml
  • myconfig.yaml.gpg

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

我认为拥有一个客户端钩子和一个服务器端钩子可以防止开发人员进行一系列更改,然后在尝试推动他们的更改时因为历史记录而陷入困境gpg文件包含未加密的数据。

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

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

1 个答案:

答案 0 :(得分:5)

您可以使用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^获取修改的文件列表),然后如果它违反了您的拒绝,则从那里拒绝更新要求。