如何找到 git 存储库的未签名添加?

How can I find unsigned additions to a git repo?

我希望所有用户 to cryptographically sign their contributions 访问 git 存储库。提交、标记、合并,一切。

假设这个过程是有缺陷的,并且有人无意或有意地设法偷偷将一个更改偷偷带到了没有签名的存储库中。我怎样才能检测到这种情况?

(另外,我如何正确指定 "everything must be signed"?我很惊讶地了解到合并可以与提交分开签名。还有什么?)

这个人 wrote a script 会在存储库中找到未签名的提交。

#!/bin/sh
#
# Validate signatures on each and every commit within the given range
##

# if a ref is provided, append range spec to include all children
chkafter="${1+..}"

# note: bash users may instead use $'\t'; the echo statement below is a more
# portable option
t=$( echo '\t' )

# Check every commit after chkafter (or all commits if chkafter was not
# provided) for a trusted signature, listing invalid commits. %G? will output
# "G" if the signature is trusted.
git log --pretty="format:%H$t%aN$t%s$t%G?" "${chkafter:-HEAD}" \
  | grep -v "${t}G$"

# grep will exit with a non-zero status if no matches are found, which we
# consider a success, so invert it
[ $? -gt 0 ]

基于 和对 git log 格式选项的一些实验,我想出了以下用于查找未签名提交的脚本。将其作为名为 git-unsigned 的文件安装在 PATH 上,您可以将其作为 git unsignedgit-unsigned:

调用
#!/bin/bash

set -e

function main() {

  if [ "" == "-h" -o "" == "--help" ]; then
    echo "usage: git-unsigned [-h|--help] [options]" >&2
    echo "Show long refs for all unsigned/unverified git commits in the current tree." >&2
    echo "  -h, --help  Display this usage guide." >&2
    echo "  options     Options to be passed to the invocation of git log." >&2
    return 1
  fi

  git log --pretty='format:%H|%aN|%s|%G?' $@ | awk -F '|' '{ if( != "G"){print ;} }'
}

if [[ ${BASH_SOURCE[0]} == [=10=] ]]; then
  main $@
fi

就我而言,我发现了一个我不谨慎且没有签署我的提交的提交:

575274a81b63d231f20e524b65030d96682fc646

不幸的是,这个问题的解决方案基本上是修改提交并对其签名,这将重写 Git 历史,这很糟糕™。

最好的办法是使用这个工具作为审计工具来查看这些提交,在检查提交时,[=17=没有发现任何可疑的东西].

相信,虽然我不确定,如果要重写此提交并强制推送它,其他提交的签名将被剥离或渲染无效,所以我认为我们在这方面还处于绿色阶段,但我想找时间测试一下。