如何找到git回购中未签名的新增内容?

如何找到git回购中未签名的新增内容?,git,gnupg,Git,Gnupg,我希望所有用户都访问git存储库。提交、标记、合并,一切 假设此过程存在缺陷,并且有人意外地或有意地设法将更改潜入尚未签名的存储库。我怎样才能发现这种情况 (还有,我如何正确地指定“所有内容都必须签名”?我惊讶地发现合并可以与提交分开签名。还有什么?这个家伙将在存储库中查找未签名的提交 #!/bin/sh # # Validate signatures on each and every commit within the given range ## # if a ref is provid

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

假设此过程存在缺陷,并且有人意外地或有意地设法将更改潜入尚未签名的存储库。我怎样才能发现这种情况

(还有,我如何正确地指定“所有内容都必须签名”?我惊讶地发现合并可以与提交分开签名。还有什么?

这个家伙将在存储库中查找未签名的提交

#!/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+$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日志
格式选项的一些实验,我提出了以下用于查找未签名提交的脚本。将此文件作为名为
git unsigned
的文件安装在
PATH
上,您可以将其作为
git unsigned
git unsigned
调用:

#!/bin/bash

set -e

function main() {

  if [ "$1" == "-h" -o "$1" == "--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($4 != "G"){print $1;} }'
}

if [[ ${BASH_SOURCE[0]} == $0 ]]; then
  main $@
fi
在我的案例中,我发现有一次我不谨慎,没有签署我的承诺:

575274a81b63d231f20e524b65030d96682fc646
不幸的是,解决这个问题的方法基本上是修改提交并签名,这将重写Git历史,这是不好的™.

最好的方法是将此工具用作审核工具来查看这些提交,检查提交后,在git show 575274A81B63D231F20E5224B65030D96682FC646中未发现可疑内容

我相信,尽管我不确定,如果一个人重写此提交并强制推送它,其他提交的签名将被剥离或变得无效,因此我认为我们在这方面仍处于绿色状态,但我希望找到时间并测试它。

“合并”只是一种提交(计算提交的父对象数:0表示“根提交”,1表示常规提交,2或更多表示“合并提交”)。只有四种存储库对象类型:提交、带注释的标记、树和blob(文件).树有固定的格式,因此无法签名。您可以要求人们对每个blob进行签名,但由于树的固定格式,不能要求他们对每个blob进行签名。不过,这样做没有什么好处,就像对单个提交进行签名一样。