2011-08-17 106 views
2

我使用gitflow分支模型的一些项目。出于这个原因,当有人克隆一个存储库时,我希望默认检出的分支是develop分支,而不是mastergit默认远程分支与gitolite

对于托管在Github上的公共项目,我可以使用该存储库的管理部分来控制这个,但对于使用gitolite管理的私有存储库,我发现的唯一工作解决方案是ssh进入托管计算机并直接使用git update-ref命令裸仓库。

有什么办法可以远程执行此操作,即不需要ssh进入远程机器?

回答

4

后实施VonC建议花了几个小时,我悲哀地发现,一个set-head脚本already exists in gitolite repository :-(

不过,我已经实现我的版本为,所以我在这里张贴。我实现一个额外的功能,可以限制设置头部命令只有存储库的创造者。也许我会分叉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" 

这是该pull request如果有人有兴趣现在

3

这种命令的ssh访问的问题是您需要一个交互式shell访问,这被认为是“坏”(因为您可以键入任何你想要的命令)。

官方gitolite解决方案,这仍然涉及SSH虽然是定义一个admin defined command

这对我来说比较重要的(大概人在“企业”的世界)分开许可推到“gitolite-admin”从服务器的无限制外壳访问回购。这个问题过去经常被访问。

到现在为止,这是二进制的 - 你可以有完整的shell访问权限,也可以没有。
如果在服务器上有合法的需要完成的任务,通常意味着你必须打破这种分离或加载少数已经有shell访问权的人。

但是,现在可以提供脚本来执行所需操作,并将它们放入$GL_ADC_PATHcontrib/adc

这些脚本可以访问下列变量:

  • GL_USER - 用户名调用命令
  • GL_BINDIR - 包含所有二进制文件的目录(特别是,gitolite.pm,这是我们真正关心的)
  • GL_REPO_BASE_ABS - 包含所有仓库的基础目录的绝对路径

你有你需要去正确repo.git并执行git update-index存在的所有信息。

+0

似乎有趣,我会探讨这个选项。 – Fabio 2011-08-17 11:15:32

+0

@Fabio:如果你设法确定能够更改默认分支为“ADC”脚本(“管理员定义的命令”),这将是,如果你能在这里发布作为一个独立的答案很大;) – VonC 2011-08-17 11:32:51

1

(在gitolite V3)我不能看到set-head脚本,并使用一个gitolite触发这样的命令: git symbolic-ref HEAD refs/heads/develop。您可以随意命名触发器文件,并从POST_GIT部分的.gitolite.rc开始。