[英]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 等)可能会更容易。
无论如何,这是解决它的一种方法。 在下面的代码中:
mapfile
将default.json
中的key列表提取到数组变量default
中mapfile
将subdirectory/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.