Git挂钩拒绝包含子模块更新的推送?

我使用gitosis来托管我的GIT存储库.

我想阻止管理员以外的用户(由提交者的电子邮件识别)将更新推送到子模块.

我试图看看我是否可以通过pre-receive hook读取子模块更改列表,但由于它是一个裸仓库,它无法读取.gitmodules.

#!/bin/bash
OLDREV=$1
NEWREV=$2
unset GIT_DIR
unset GIT_WORKING_TREE
SUBS=$(git show $NEWREV:.gitmodules | sed -n "s/^.*git@repo://p")

for submod in SUBS
do
        echo $submod
done

exit 1

但我得到:

remote: fatal: Path '.gitmodules' does not exist (neither on disk nor in the index).

你知道我怎么能读取在预接收挂钩中被推送的子模块提交吗?

最佳答案 您的问题在于您尝试阅读OLDREV和NEWREF的方式.

Githooks没有像你期望的那样获得他们的论点,他们被写入stdin,这实际上意味着他们被管道输入.

要正确阅读它们,您必须执行以下操作:

while read OLDREF NEWREF REFNAME
do
    # Work with the references ...
done

pre-push.example挂钩 – 你可以在每个git存储库中找到 – 给出了一个很好的印象.

点赞