【问题标题】:Is there a way to lock a branch in GIT有没有办法在 GIT 中锁定一个分支
【发布时间】:2011-01-29 02:30:42
【问题描述】:

我有一个想法,通过在 GIT 更新挂钩中设置一个锁定脚本来锁定用户将文件推送到其中的存储库,因为推送只能将用户 ID 识别为参数而不是分支。所以我可以锁定整个 repo,它只是锁定一个目录。

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

或者有什么方法可以让 Update Hook 识别用户从哪个分支推送以及代码被推送到哪个分支?

【问题讨论】:

  • 你想永远锁定分支名称(然后使用标签),还是只是阻止其他人推送到它?
  • 拥有一个单独的回购并拉入其中有什么问题?这将是一个更标准的工作流程。

标签: git git-branch


【解决方案1】:

被推送到的分支是update hook 的第一个参数。如果你想锁定分支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

【讨论】:

  • 我在 GitHub 上的远程仓库中没有看到 .git 目录。我只在我的本地克隆仓库中看到一个 .git 目录。但我不认为将这段代码放在本地仓库中的 .git/hooks/update 中会阻止任何人从本地仓库推送到远程分支。我错过了什么吗?
  • @AjoyBhatia 必须有一个 .git 目录。如果是裸仓库,那么主目录已经是 .git 目录了。 (如果你有 HEAD、分支、钩子、配置等文件/文件夹,这是一个裸仓库。)将你的钩子放入钩子/目录
【解决方案2】:

更新挂钩,来自文档:

钩子对每个要更新的 ref 执行一次,并接受三个参数:

  • 正在更新的 ref 的名称,
  • 存储在 ref 中的旧对象名称,
  • 以及要存储在引用中的新对象名。

所以...是的,它确切地知道正在推送哪个分支,并且可以简单地检查该参数并在不希望将分支推送到时退出失败。

如果您想(智能地)在用户上传对象之前执行此操作,您可以使用 pre-receive 挂钩:

这个钩子为接收操作执行一次。它不接受任何参数,但是对于每个要更新的 ref,它会在标准输入中接收格式如下的一行:

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

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

(那些是空格和换行)

【讨论】:

  • 这个信息确实对我有帮助,但是更新钩子只知道被推送的分支(源分支),有没有办法从更新钩子中捕获代码被推送到的分支(目标分支)?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您可以使用pre-commit 来执行此操作。它有一个内置的no-commit-to-branch 钩子,可用于防止提交到一个或多个分支。

    设置

    基本的设置过程是:

    • 使用 pip 或 brew 安装(说明在 https://pre-commit.com/#install
    • 在项目的根目录中创建一个.pre-commit-config.yaml 文件(初稿见下文)
    • 通过运行 pre-commit install 将挂钩安装到您的 git 配置中。

    保护分支的基本配置

    这是一个仅包含 no-commit-to-branch 钩子的基本配置:

    repos:
    - repo: https://github.com/pre-commit/pre-commit-hooks
      rev: v2.2.5
      hooks:
        - id: no-commit-to-branch
          args: ['--branch', 'master']
    

    如果你想保护多个分支,你可以使用在参数列表中包含多个 --branch 参数:

    repos:
    - repo: https://github.com/pre-commit/pre-commit-hooks
      rev: v2.2.5
      hooks:
        - id: no-commit-to-branch
          args: ['--branch', 'master', '--branch', 'staging']
    

    这不是矫枉过正吗?

    Pre-commit 还有许多其他built-in hooks, and a large collection of community-built hooks,它们将改变您清理和验证提交的方式。我提到这一点的原因是,虽然这个工具对于防止提交到受保护的分支可能有点过头了,但它还有许多其他功能,使其成为任何 git 项目的引人注目且简单的补充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多