是否可以在不手动编辑gitolite.conf文件的情况下修改wild respos的git config选项?

时间:2015-02-24 02:56:57

标签: gitolite

假设我已经推送并配置了野生仓库foo/bar

如果我想为此repo添加邮件列表选项,一种方法是将以下内容添加到我的gitolite.conf文件中。

repo foo/ba[r]
    config hooks.mailinglist = foo@bar.com

但是,这要求我可以访问属于gitolite.conf存储库的gitolite-admin

普通用户有没有办法进行此修改,而无法访问管理配置文件?

请注意,我已经仔细阅读documentation无效。

1 个答案:

答案 0 :(得分:2)

我从following answer获得gitolite mailing list。但是,这个答案不能处理GIT_CONFIG_KEYS中的外卡,所以我修改了它来处理这个问题,就像gitolite一样。

commands/config内插入以下内容就足够了,然后将config添加到.gitolite.rc中已启用选项的列表中。

#!/bin/bash

# Usage:    ssh git@host config <repo> --get <name>
#           ssh git@host config <repo> --set <name> <value>
#           ssh git@host config <repo> --unset <name>
#
# Set a "git config" option on a repo. You must be an owner of the
# repo, and the config option name must be allowed by the gitolite.rc
# configuration.

die() { echo "$@" >&2; exit 1; }
usage() { perl -lne 'print substr($_, 2) if /^# Usage/../^$/' < $0; exit 1; }
[ -z "$1" ] && usage
[ "$1" = "-h" ] && usage
[ -z "$GL_USER" ] && die GL_USER not set

repo="$1"; shift

gitolite owns "$repo" || die "repository '$repo' missing or you do not own it"
cd `gitolite query-rc GL_REPO_BASE`/"$repo".git || die "missing repository '$1'";

case $1 in
--get)  action='--get'
        shift
        [ "$#" -eq 1 ] || usage
        ;;
--set)  action='--set'
        shift
        [ "$#" -gt 1 ] || usage
        ;;
--unset)
        action='--unset'
        shift
        [ "$#" -eq 1 ] || usage
        ;;
*)      if [ "$#" -eq 1 ]
        then action='--get'
        else action='--set'
        fi
        ;;
esac

name="$1"; shift

ALLOWED_CONFIG=$(gitolite query-rc GIT_CONFIG_KEYS)

export ALLOWED_CONFIG                                             
export name                                                       

deny=$(perl -e '                                                  
     my @validkeys = split( " ", ( $ENV{ALLOWED_CONFIG} || "" ) );
     my @matched = grep { $ENV{name} =~ /^$_$/i } @validkeys;     
     if (@matched < 1) {print "Denied\n";}')                      

if [[ -n "$deny" ]]; then                                         
        die "config option '$name' not allowed by gitolite.rc"    
        exit 1                                                    
fi 



# there is not much need to sanitise the input; by default all
# arguments to commands are restricted to these: -0-9a-zA-Z._\@/+ :,\%=
# (see Gitolite::Rc.pm, the variable is $REMOTE_COMMAND_PATT) however
# for safety we will check the value for consistency with $UNSAFE_PATT

UNSAFE_PATT='.*[`~#\$\&()|;<>]'

case $action in
--set)  if expr "$*" : "$UNSAFE_PATT" >/dev/null
        then
                die "value '$*' contains unsafe characters"
        else
                git config "$name" "$*"
        fi
        ;;
*)      git config $action "$name"
        ;;
esac