在使用 Gitolite 在服务器上的主 Git 仓库旁边,我希望每个开发者都有可能建立自己本地仓库的镜像。这并不困难。但是,我想禁用主 Git 服务器仓库上的 `git push --mirror` 命令,以防止开发者在进行镜像时出错。我认为最好的地方是 hook,也许是 update hook。但是我无法找到如何在服务器 hook 中检测到客户端机器上已经执行了 `push --mirror` 命令的方法。由于我们还使用 Eclipse Git (JGit),所以客户端解决方案是不可行的。
pre-receive
。您无法直接检测它是否为镜像推送,因为发送的数据中没有关于其的任何内容,但您可以很聪明地几乎每次都正确地获取到。pre-receive钩子获取要更新的引用列表,包括旧值和新值,如果以非零状态退出,则整个推送都会被取消。镜像推送的主要特征可能是它还会按原样推送远程分支。我想不出任何正常情况下您会这样做的情况,所以您可以进行检查,例如:#!/bin/bash
while read old new ref; do
if [[ "$ref" =~ "^refs/remotes/.*" ]]; then
echo "You're pushing remote branches - did you use 'push --mirror'?"
echo "Rejecting push"
exit 1
fi
done
push --mirror
*都会触发此钩子,因此它应该适用于您;当然,这有点过于热心,但除非您打算在中央仓库中维护远程分支,否则不会有影响。
*除了一个非常手动的操作,即有人通过手动指定git push --mirror <url>
从没有远程的仓库推送,但我真的希望您不必担心这个。
core.logAllRefUpdates
设置为true以确保在出现错误推送时可以进行恢复。push --mirror
的最糟糕部分我不建议使用钩子来“修补”安全性。它们没有为这种访问控制而设计。
你可以考虑使用 gitolite。它可以让你在预设的分支上控制访问权限。