gpt4 book ai didi

git - 如何在中央 "development repository"配置只读分支?

转载 作者:太空狗 更新时间:2023-10-29 14:48:02 25 4
gpt4 key购买 nike

我必须为受控 git 存储库的一些远程分支配置只读访问权限。

场景如下:

对于我们的开发,我们有一个内部“开发存储库”(1),它反射(reflect)了一个“外部存储库”。此“开发存储库”定期更新(cron 作业中的 git remote update)。我们的开发发生在从外部存储库派生的分支“dev_*”中,但从不直接在外部分支上:

Repositories schema

master 添加功能的工作流程:

  1. 我们创建一个分支 dev_master 并将 master 作为父分支。
  2. John 克隆存储库 development,检查 dev_master,对其进行处理,并定期推送回 development
  3. 如果存储库 external 得到 master 更新,那么 development 中的 master 也会更新(由于上面提到的cronjob),并且有人可以在 dev_master 上 merge master,因此我们与 external 保持同步。

我们需要禁止 John 推送到 development 的分支 master,这样他的更改在 external 的定期更新后不会丢失>.

再次,原理图:

Repositories summary


注意事项

(1) 我发现有些人称这个开发库为“暂存库”(例如,在 How do I setup a staging repository in git? 中,出现了非常相似的情况)

最佳答案

我使用 Server-Side hook 禁止这些推送.来自 git help hooks:

pre-receive
This hook is invoked by git-receive-pack on the remote repository, which happens when a git push is done on a local repository. Just before starting to update refs on the remote repository, the pre-receive hook is invoked. Its exit status determines the success or failure of the update.
[...]
If the hook exits with non-zero status, none of the refs will be updated. If the hook exits with zero, updating of individual refs can still be prevented by the update hook.
[...]

钩子(Hook)代码:

#!/bin/bash

# Read the branches of the remote repository
remote_branches=$(git ls-remote --heads | sed "s,.*\(refs/heads/\),\1,")

function forbid_push_to_remote_branches()
{
while read old_value new_value ref_name
do
# Test for existence of [$ref_name] in remote
for remote_branch in $remote_branches
do
if [[ $remote_branch == $ref_name ]]
then
invalid_refs="$invalid_refs [$remote_branch]"
break
fi
done
done

# if remote read-only branches found, exit with non-zero
# and list these branches
if [[ -n $invalid_refs ]]
then
echo "ERROR: You are trying to push to remote branch(es):" >&2
echo " $invalid_refs" >&2
return 1
else
return 0
fi
}

forbid_push_to_remote_branches
exit $?

此代码必须复制到服务器中的文件$(bare_repo_path.git)/hooks/pre-receive(没有pre-receive.sample) .

关于git - 如何在中央 "development repository"配置只读分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14502164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com