我正在为某些项目使用gitflow分支模型。因此,当有人克隆存储库时,我希望默认签出分支是develop
分支而不是master
.
对于托管在 Github 上的公共项目,我可以使用该存储库的 Admin 部分来控制它,但是对于使用 gitolite 管理的私有存储库,我发现的唯一可行的解决方案是 ssh 到主机并直接在裸机中使用git update-ref命令存储库。
有什么方法可以远程执行此操作,即无需 ssh 进入远程机器?
我正在为某些项目使用gitflow分支模型。因此,当有人克隆存储库时,我希望默认签出分支是develop
分支而不是master
.
对于托管在 Github 上的公共项目,我可以使用该存储库的 Admin 部分来控制它,但是对于使用 gitolite 管理的私有存储库,我发现的唯一可行的解决方案是 ssh 到主机并直接在裸机中使用git update-ref命令存储库。
有什么方法可以远程执行此操作,即无需 ssh 进入远程机器?
在花了几个小时实施 VonC 建议后,我遗憾地发现gitolite 存储库中已经存在set-head
一个脚本:-(
但是我已经为此实现了我的版本,所以我将它发布在这里。我实现了一个附加功能,它可以将 set-head 命令仅限于存储库创建者。也许我会分叉 gitolite 项目并将该功能添加到原始版本中。
顺便说一句,这是我的版本:
#!/bin/sh
. $(dirname $0)/adc.common-functions
[ $# -eq 2 ] || die "usage: $0 <repo> <branch>"
if [ $SDB_WRITER_ALLOWED ]; then
# this will check only for write permission on the given repository
get_rights_and_owner $1 # this also set $repo variable
[ -z "$perm_write" ] && die "You don't have write permission on $repo"
else
# require a repository creator to change default branch
valid_owned_repo $1
fi
# move to repo dir
cd "$GL_REPO_BASE_ABS/$repo.git"
# check for branch existence
match=`git branch | sed 's/^\( \|*\) //' | grep $2`
# this will check for an exact match in branch name
[ "$2" = "$match" ] || die "Unable to find branch $2 in repository $repo"
# update the default checked out branch
git symbolic-ref HEAD refs/heads/$match
echo "Head branch for repository $1 updated to $2"
如果有人感兴趣,这是拉取请求
对这种命令进行 ssh 访问的问题是您需要交互式 shell 访问,这被认为是“不好的”(因为您可以键入任何您想要的命令)。
官方的 gitolite 解决方案,但仍然涉及 ssh,是定义一个管理员定义的命令:
gitolite-admin
对我(可能还有“公司”世界中的其他人)来说,将推送到“ ”存储库的权限与对服务器的不受限制的 shell 访问分开是相当重要的。过去经常访问此问题。不过,到目前为止,这是二进制文件——您要么拥有完整的 shell 访问权限,要么根本没有访问权限。
如果有合法需要从服务器上的 shell 完成的任务,这通常意味着你必须打破这种分离或加载少数已经拥有 shell 访问权限的人。但是,现在可以提供脚本来执行您想要的操作,并将它们放入
$GL_ADC_PATH
.contrib/adc
这些脚本可以访问以下变量:
GL_USER
-- 调用命令的用户名GL_BINDIR
-- 包含所有二进制文件的目录(特别是 gitolite.pm,这是我们在这里真正关心的)GL_REPO_BASE_ABS
-- 包含所有 repos 的基本目录的绝对路径
您拥有前往正确的 repo.git 并在git update-index
那里执行所需的所有信息。
现在(在 gitolite v3 中)我看不到set-head
脚本并使用 gitolite 触发器执行此命令:git symbolic-ref HEAD refs/heads/develop
. 您可以随意命名触发器文件并从.gitolite.rc
POST_GIT 部分开始。