2

我正在为某些项目使用gitflow分支模型。因此,当有人克隆存储库时,我希望默认签出分支是develop分支而不是master.

对于托管在 Github 上的公共项目,我可以使用该存储库的 Admin 部分来控制它,但是对于使用 gitolite 管理的私有存储库,我发现的唯一可行的解​​决方案是 ssh 到主机并直接在裸机中使用git update-ref命令存储库。

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

4

3 回答 3

4

在花了几个小时实施 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"

如果有人感兴趣,这是拉取请求

于 2011-08-24T16:07:57.387 回答
3

对这种命令进行 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那里执行所需的所有信息。

于 2011-08-17T11:06:39.960 回答
1

现在(在 gitolite v3 中)我看不到set-head脚本并使用 gitolite 触发器执行此命令:git symbolic-ref HEAD refs/heads/develop. 您可以随意命名触发器文件并从.gitolite.rcPOST_GIT 部分开始。

于 2012-05-12T20:27:22.637 回答