有没有办法在GIT中锁定分支

Sen*_*mar 41 git git-branch

我想通过在GIT更新挂钩中使用锁定脚本来锁定用户将文件推入其中的存储库,因为推送只能将userid识别为参数而不是分支.所以我可以锁定刚刚锁定目录的整个仓库.

有没有办法锁定GIT中的特定分支?

或者,Update Hook是否可以识别用户正在推送哪个分支以及推送代码的分支?

eck*_*kes 40

被推送的分支是更新钩子的第一个参数.如果要锁定分支myfeature以进行推送,则此代码(放入hooks/update)将执行此操作:

#!/bin/sh
# lock the myfeature branch for pushing
refname="$1"

if [[ $refname == "refs/heads/myfeature" ]]
then
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    echo "You cannot push to myfeature! It's locked"
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    exit 1
fi
exit 0
Run Code Online (Sandbox Code Playgroud)

  • 我没有在GitHub上的远程仓库中看到.git目录.我只在我的本地克隆仓库中看到一个.git目录.但我认为将此代码放在我的本地仓库中的.git/hooks/update中会产生阻止任何人从其本地仓库推送到该远程分支的效果.我错过了什么吗? (2认同)

Cas*_*bel 9

更新钩子,来自文档:

钩子为每个ref更新执行一次,并带有三个参数:

  • 要更新的ref的名称,
  • 存储在ref中的旧对象名称,
  • 以及要存储在ref中的新对象名.

所以...是的,它确切地知道正在推送什么分支,并且可以简单地检查该参数并且如果它不希望分支被推送则退出失败.

如果您希望(智能地)在用户上传对象之前执行此操作,您可以使用预接收挂钩:

该钩子为接收操作执行一次.它不需要参数,但是对于每个ref都要更新它在标准输入上接收格式的一行:

<old-value>SP <new-value>SP <ref-name>LF

其中<old-value>存储在ref中的旧对象名称是要存储在ref <new-value>中的新对象名称,并且<ref-name>是ref 的全名.

(那些是空格和换行)


小智 7

像gitolite这样的工具我相信这种功能:http://github.com/sitaramc/gitolite