Add mailinglist command to gitolite

971 views
542 views

Published on

How does gitolite works?
How to add mailinglist command to gitolite?

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
971
On SlideShare
0
From Embeds
0
Number of Embeds
132
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Add mailinglist command to gitolite

  1. 1. Gitolite
  2. 2. 基础原理 • • • • 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'
  3. 3. 如何插入gitolite • 如何“劫持”掉ssh上来的git-*命令? • 秘密在~/.ssh/authorized_keys里:
  4. 4. 原理实现 • • • • 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"'
  5. 5. 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脚本
  6. 6. 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列表
  7. 7. gitolite command • gitolite支持的command,脚本判断逻辑分成: – – – – – setup compile trigger list-phy-repos _which("commands/$command", 'x') • 所以主要的特殊命令都是在~/bin/commands/下通过一个个同名脚 本实现的。一共有26个——但是注意之前gitolite.rc里有开关,默认 只开了5个。 • 脚本不要求是Perl,实际上也有不少是Bash写的。
  8. 8. 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';
  9. 9. repo specific hook • 通过trigger触发 • 必须通过gitolite-options.hooks.*设定 • 同样需要在.gitolite.rc配置中开启才能使 用
  10. 10. mailinglist实现
  11. 11. 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的返回值。
  12. 12. 总结 • 实现mailinglist命令行操作需要: 1. 修改.gitolite.rc文件,添加ENABLE数组里的命令,编辑 允许的GIT_CONFIG_KEYS; 2. 在.gitolite/hooks/common/下创建post-receive文件 ,即git默认的post-receive-email 3. 在bin/commands/下创建mailinglist程序

×