繁体   English   中英

预收挂钩,Bash + Git

[英]Pre-receive hook, Bash + Git

尝试为 bitbucket 服务器存储库编写预接收挂钩。

该仓库仅包含 json 文件:

默认.json
/子目录/覆盖.json

default.json 文件具有一系列键/值对,overwrite.json 文件应具有键的精确副本,但没有值。

即:default.json = { myKey:"someValue"},覆盖.json = { myKey:"someOtherValue"}

当开发人员提交“overwrite.json”时,我需要预先接收以将文件与服务器上的文件进行比较,以确保键匹配(不能具有未在 default.json 中定义的键/值)

这是到目前为止的预接收挂钩代码:

#>******************************************************
while read line
do
    echo "[INFO] Reading in stdin"
    # if line is not empty
    if [[ -n "${line// }" ]]; then
        # Split the line into an array.
        IFS=' ' read -r -a array <<< "$line"
        # This is the standard Git behaviour for pre-receive:
        parentsha=${array[0]}
        currentsha=${array[1]}
        ref=${array[2]}
        echo "[INFO] "
        echo "[INFO] Current line: "
        echo "[INFO] > Parent sha: $parentsha"
        echo "[INFO] > Current sha: $currentsha"
        echo "[INFO] Ref: $ref"
    fi
done
git show
echo "[INFO] END of pre-receive script 21"
exit 0

上面的代码为更改生成 sha 值,我可以看到文件的实际更改,但是从这里开始读取实际提交的文件以及如何将文件与文件进行比较,我有点迷失了在服务器上

虽然可以使用 Bash 脚本解决此问题,但您需要像jq这样的外部工具来解析 JSON 文件以提取密钥。 使用具有本机 JSON 解析器的另一种语言(Python、Perl、Ruby 等)可能会更容易。

无论如何,这是解决它的一种方法。 在下面的代码中:

  • 我们使用mapfiledefault.json中的key列表提取到数组变量default
  • 我们使用mapfilesubdirectory/overwrite.json /overwrite.json 中的键列表提取到数组变量overrides
  • 我们遍历$overrides中的键列表,根据$default中的键列表检查每个键。
#!/bin/bash

while read -r -a ref; do
    mapfile -t default <<< $(git show ${ref[1]}:default.json | jq -r 'keys[]')
    mapfile -t overrides <<< $(git show ${ref[1]}:subdirectory/overwrite.json | jq -r 'keys[]')

    for key in "${overrides[@]}"; do
        found=0
        for defkey in "${default[@]}"; do
            if [[ $defkey = $key ]]; then
                found=1
                break
            fi
        done

        if [[ $found -ne 1 ]]; then
            echo "ERROR: key $key not in default.json" >&2
            exit 1
        fi
    done
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM