狠狠撸

狠狠撸Share a Scribd company logo
Gitolite
基础原理
?
?
?
?

gitolite的最基本原理(基于ssh的git命令):
git clone git@host:repo.git
等价于
ssh git@host 'git-upload-pack repo.git'

? git push
? 等价于
? ssh git@host 'git-receive-pack repo.git'
如何插入gitolite
? 如何“劫持”掉ssh上来的git-*命令?
? 秘密在~/.ssh/authorized_keys里:
原理实现
?
?
?
?

gitolite实际效果:
git clone git@host:repo.git
等价于
ssh git@host '/home/git/bin/gitolite-shell chenlin.rao
SSH_ORIGINAL_COMMAND="git-upload-pack repo.git"'

? git push
? 等价于
? ssh git@host '/home/git/bin/gitolite-shell chenlin.rao
SSH_ORIGINAL_COMMAND="git-receive-pack repo.git"'
gitolite-shell实现
? 设置GL_USER环境变量
? 解析校验sshd设置的SSH_ORIGINAL_COMMAND环境变量

匹配git-upload-pack|git-receive-pack|git-upload-archive的就是git命令
匹配$rc{COMMANDS}的就是gitolite命令

?
?
?
?
?

设置GL_REPO环境变量
检查是否存在,不存在且允许的话就创建新repo
检查GL_BYPASS_ACCESS_CHECKS环境变量是否可以跳过
调用Gitolite::Conf::Load::access()函数检查操作权限
调用常规git命令 / 调用gitolite command脚本
gitolite.rc
? 整个文件就存了一个%rc大哈希,各种配置。
?
?
?
?
?
?
?
?
?
?
?
?
?

GIT_CONFIG_KEYS
ROLES => {
READERS =>
WRITERS =>
},
LOCAL_CODE
=>
ENABLE => [
'help',
'desc',
'info',
'perms',
'writable',
]

=> 'hooks.*', #允许git_config调用的key
1,
1,
"$ENV{HOME}/.gitolite", #存放hooks、logs等的位置

# 默认可用的gitolite command列表
gitolite command
? gitolite支持的command,脚本判断逻辑分成:
–
–
–
–
–

setup
compile
trigger
list-phy-repos
_which("commands/$command", 'x')

? 所以主要的特殊命令都是在~/bin/commands/下通过一个个同名脚
本实现的。一共有26个——但是注意之前gitolite.rc里有开关,默认
只开了5个。
? 脚本不要求是Perl,实际上也有不少是Bash写的。
gitolite hooks
? 在创建repo的时候,Gitolite::Conf::Store::new_repo里在git
init --bare之后还调用了一个hook_1()函数。这个函数干的事情:
# propagate user-defined (custom) hooks to all repos
ln_sf( "$rc{LOCAL_CODE}/hooks/common", "*",
"$repo.git/hooks" ) if $rc{LOCAL_CODE};
# override/propagate gitolite defined hooks for all repos
ln_sf( "$rc{GL_ADMIN_BASE}/hooks/common", "*",
"$repo.git/hooks" );
# override/propagate gitolite defined hooks for the admin repo
ln_sf( "$rc{GL_ADMIN_BASE}/hooks/gitolite-admin", "*",
"$repo.git/hooks" ) if $repo eq 'gitolite-admin';
repo specific hook
? 通过trigger触发
? 必须通过gitolite-options.hooks.*设定
? 同样需要在.gitolite.rc配置中开启才能使
用
尘补颈濒颈苍驳濒颈蝉迟实现
mailinglist解释
? 整个%config模仿了Gitolite::Conf::Store和
Gitolite::Conf::Load
? 因为gitolite git-config命令,采用的
Gitolite::Conf::Load::git_config()里会强制使用$repo.git/glconf文件里的%one_repo和%one_config。而最重要的access()
等函数都会用到这个git_config的返回值。
总结
? 实现mailinglist命令行操作需要:
1. 修改.gitolite.rc文件,添加ENABLE数组里的命令,编辑
允许的GIT_CONFIG_KEYS;
2. 在.gitolite/hooks/common/下创建post-receive文件
,即git默认的post-receive-email
3. 在bin/commands/下创建mailinglist程序
Add mailinglist command to gitolite

More Related Content

Add mailinglist command to gitolite