我正在为某些项目使用gitflow分支模型。出于这个原因,当有人克隆存储库时,我希望默认的签出分支是develop
分支而不是master
。
对于在Github上托管的公共项目,我可以使用该存储库的Admin部分来控制它,但对于使用gitolite管理的私有存储库,我找到的唯一可行解决方案是ssh到托管计算机并使用git update-ref命令直接在裸存储库中。
有没有办法远程执行此操作,即无需ssh到远程计算机?
答案 0 :(得分:4)
花了几个小时来实施VonC建议后,我遗憾地发现set-head
脚本already exists in gitolite repository: - (
但是我已经实现了我的版本所以我在这里发布它。我实现了一个额外的功能,它可以将set-head命令仅限制为存储库创建者。也许我会分叉gitolite项目并将该功能添加到原始版本。
BTW这是我的版本:
#!/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"
如果有人感兴趣的话,那就是pull request
答案 1 :(得分:3)
对于这种命令的ssh访问问题是你需要一个交互式shell访问,这被认为是“坏”(因为你可以输入你想要的任何命令)。
官方的gitolite解决方案,仍然涉及ssh,是定义 admin defined command :
对我(以及可能是“公司”世界中的其他人)来说,将对“
gitolite-admin
”repo的权限与对服务器的无限制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
。
答案 2 :(得分:1)
现在(在gitolite v3中)我看不到set-head
脚本并使用gitolite触发器执行此命令:git symbolic-ref HEAD refs/heads/develop
。您可以根据需要为触发器文件命名,并从POST_GIT部分的.gitolite.rc
开始。