您的位置:首页 > 其它

ossxp gitolite 改进

2013-01-13 20:25 162 查看
改进内容:

1. 解决了因路径名称导致钩子设置的问题

https://github.com/purple-dragon/gitolite/commits/master  中 id 56f685...1144d887的commit即 "fix
path to ensure replace in gl-system-instll work well"

2. 增加了将 gitolite提供的配置和钩子(/home/git/bin/gitolite/share/gitolite/conf and hooks目录)拷贝到$GL_ADMINDIR/hooks/   // GL_ADMINDIR == ~/.gitolite/

https://github.com/purple-dragon/gitolite/commits/master  中 id 13fdb5...ee8d05b9的commit即 "improve
gl-install: copy hooks in package to"

3. 将各个repo的hook指向$GL_ADMINDIR/hooks中的钩子,而非原来的安装路径(如本文用的/home/git/bin/gitolite/share/gitolite/hooks/)下的钩子

https://github.com/purple-dragon/gitolite/commits/master  中 id a2ea64...a9d9c612的commit即 "do
not use hooks in $GL_PACKAGE_HOOKS, use hooks in $GL_ADMINDIR instead"

改进后的gitolite可以从此处获得:
git clone git://github.com/purple-dragon/gitolite.git
将下面step6直接命令:$gl-setup /tmp/username.pub   // 如果配置文件~/.gitolite.rc改变了,要重新执行gl-setup无参

(可以不改任何文件, 当然.gitolite.rc中有不合适的配置是可以修改的,GL_PACKAGE_HOOKS & GL_PACKAGE_CONF就不用改了,已经自动改成安装路径了)

蒋鑫版(git clone git://github.com/ossxp-com/gitolite.git) 安装步骤:

root用户下做如下事情

1. groupadd git  // 添加group:git

2. adduser -r -m --shell /bin/bash --group git  git  // 创建专用账号git,所有用户都用此账号访问git库

            // -r create a system account     (centos -r, ubuntu 是 --system)

            // -m create home dir

            // -s, --shell The name of the user’s login shell, if it's empty then system will choose a default shell

            // -g  specify an existing group
            // 最后的git是用户名

切换到git账号

3. mkdir -p /home/git/bin/gitolite/share/gitolite/conf/ /home/git/bin/gitolite/share/gitolite/hooks/

4. 下载gitolite

git clone git://github.com/ossxp-com/gitolite.git

4.1 ssh-keygen  

   // Enter file in which to save the key (/home/git/.ssh/id_rsa):

   // 指定/home/git/.ssh/git, 如果不指定路径,则在当前路径

   // Enter passphrase (empty for no passphrase):  这里直接回车

   // 最后生成公钥(/home/git/.ssh/git.pub)和私钥(/home/git/.ssh/git)

4.2 cp ~/.ssh/username.pub ~/tmp/  // 备用

4.3 系统环境变量加上 PATH=$PATH: /home/git/bin/gitolite

5. 安装

5.1 rm -rf ~/.gitolite/  ~/.gitolite.rc  ~/.gitconfig // 删除旧的gitolite信息

      rm -rf ~/.ssh/authorized_keys 

      rm -rf /home/git/bin/gitolite/*  //删掉以前的安装版本

5.2 采用源代码方式安装gitolite(到gitolite源码所在位置, 上面clone下来的目录/gitolite/src/执行下面的命令)

$./gl-system-install /home/git/bin/gitolite  /home/git/bin/gitolite/share/gitolite/conf/ /home/git/bin/gitolite/share/gitolite/hooks/

如果gitolite有更新,则也需要用上面的命令来重装gitolite

6. 用gitolite创建仓库

6.1 编辑/home/git/bin/gitolite/gl-setup

    把GL_PACKAGE_CONF变量改成上面安装gitolite的配置目录,如:
    GL_PACKAGE_CONF=/home/git/bin/gitolite/share/gitolite/conf/  
// 否则会打开一个空的~/.gitolite.rc,就不知道该如何往里写配置信息了

     // 因为gl-system-install有问题,所以安装以后还要手工改安装目录中的这个文件gl-setup,见6.3.2

6.2 $ gl-setup /tmp/username.pub   // 这里提供的公钥是作为管理员的(用ssh-keygen生成,在~/.ssh/目录下)

      // 如果配置文件~/.gitolite.rc改变了,要重新执行gl-setup无参

     -- 其中有内容, 且自于$GL_PACKAGE_CONF/example.gitolite.rc

         因此上面要指定相应的文件(如果没有的话,可能会建立一个空文件,也可能这条命令不能执行)

     -- 编辑自动打开的.gitolite.rc文件:

        --- 一定要修改$GL_PACKAGE_HOOKS,改成gl-system-install指定的hook目录即/home/git/bin/gitolite/share/gitolite/hooks

             否则($GL_ADMINDIR(~/.gitolite)/hooks目录中将没有钩子脚本)钩子就不能正确设置, 就失去了gitolite提供给各个仓库的钩子功能

         --- 可以修改gitolite自动建立的仓库根目录的名称$REPO_BASE, 默认是repositories, 也可以改成其他名字,如本文使用 repos

              但gl-setup执行之后就不要修改该名字

     -- .gitolite.rc编辑完成后保存退出,继续自动执行:

         creating gitolite-admin...

         Initialized empty Git repository in /home/git/repos/gitolite-admin.git/     // 自动创建了gitolite-admin库

         creating testing...

         Initialized empty Git repository in /home/git/repos/testing.git/                // 自动创建了testing库,可用于测试,没有任何提交

         [master (root-commit) a88bdee] start                                                         //  自动对gitolite-admin库进行一次提交,包括:

         2 files changed, 6 insertions(+)

         create mode 100644 conf/gitolite.conf                                                      //  添加授权配置文件,包含了gitolite-admin & testing两个库的授权

         create mode 100644 keydir/git.pub                                                           //  将gl-setup指定的公钥文件添加到keydir/下面

     -- 自动创建了/home/git/.gitolite/

         conf/gitolite.conf   // 自动生成,这个是授权文件
         keydir/                  // 将username.pub自动拷贝到这里

         hooks/                  // 将gitolite提供的hook文件自动拷贝到此(ossxp-com版本的安装程序有问题,所有这里是空的)

         更新~/.ssh/authorized_keys  //这个文件中就会有git用户的信息

6.3 钩子的设置有问题: clone出来的gitolite-admin不能管理新仓库的创建,授权等操作,其他仓库也没有用上gitolite提供的钩子
6.3.1 手工解决法:// 如果上面编辑.gitolite.rc时,忽略了$GL_PACKAGE_HOOKS,则可以现在手工做

  6.3.1.1. 修改 ~/.gitolite.rc的环境变量$GL_PACKAGE_HOOKS = "/home/git/bin/gitolite/share/gitolite/hooks";

  6.3.1.2. 执行gl-setup,无参  (执行后 ~/repos/中的各个repo的hooks目录中的钩子都指向/home/git/bin/gitolite/share/gitolite/hooks)
6.3.2 彻底解决法:// 完成后重新执行5~6.2

因为gl-system-install中replace( "/tmp/share/gitolite/conf",  $conf_dir,  "$conf_dir/example.gitolite.rc" );是将临时目录修改成实际安装目录,其中

$conf_dir/example.gitolite.rc,$conf_dir === /home/git/bin/gitolite/share/gitolite/conf/

$bin_dir/gl-setup,$bin_dir ===  /home/git/bin/  

这2个目录中的example.gitolite.rc和gl-setup实际是gl-system-install安装时从gitolite源码包里的conf/example.gitolite.rc和 src/gl-setup拷贝过来的,

因此改的是这两个位置的文件,不是安装路径(/home/git/bin/ 和 /home/git/bin/gitolite/share/gitolite/conf/)下的

由于这两个文件中的“/tmp/share/gitolite/conf” 被改成了"/usr/share/gitolite/conf"所以这个替换并没有完成,

因此把这两个文件中的路径中的usr改回tmp即可,或者把src/gl-system-install中replace( "/tmp/share/gitolite/conf",  $conf_dir,  "$conf_dir/example.gitolite.rc"
)的 tmp改成usr

P.S.

.gitolite.rc中有下面两个变量,会被gl-setup中设置的改名变量重新赋值

$GL_PACKAGE_CONF = "/usr/share/gitolite/conf";  // 所以.gitolite.rc这个变量改不改都会被gl-setup中的该变量重新赋值

$GL_PACKAGE_HOOKS = "/usr/share/gitolite/hooks"; // 这个要改,因为gl-setup并没有对该变量重新赋值,而且gl-install中也用到了该变量,不改不行

7. 主机别名

添加文件,~/.ssh/config,内容如下

host gitolite

     user git

     hostname serverip

     port 22

     identityfile ~/.ssh/admin

8. 设置好~/.ssh/config 若碰到下面的error

Bad owner or permissions on $HOME/.ssh/config

则将.ssh/config 的文件的权限改成和 .ssh目录一样即可

9. 如果不设置主机别名git clone git@localhost:gitolite-admin 时会有警告说clone了一个空仓库,clone出来的仓库也是空的,没有任何提交记录。

  clone出来的不是repos/gitolite-admin/ (git log查看可以看到有一次提交 comments是 gl-setup 命令 (e.g.   gl-setup /home/git/git.pub))

10. 新增版本库以及该版本库的第一次推送

10.1 cd ~

git clone git@gitolite:gitolite-admin

10.2 编辑 ~/gitolite-admin/conf/gitolite.conf 新加如下内容:

repo mytest

    RW+     =   @all

10.3 提交这次修改,并推送,这时在~/repos中就会自动生成mytest.git,且没有任何提交

10.4 clone出mytest :  git clone git@gitolite:mytest

往mytest添加内容并commit,然后push,则会出现如下错误

fatal: The remote end hung up unexpectedly

error: failed to push some refs to 'git@localhost:mytest' 

//  这是Git 找不到你要提交的版本了

解决方法:

git push origin master    // 将master 推送到origin,以后每次就只要用git push就行了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Git gitolite 蒋鑫