您的位置:首页 > 其它

在MAC下使用gitosis来配置git服务

2014-05-02 23:18 288 查看
本文转载自:http://blog.csdn.net/boy15174/article/details/8645320

因为第一次使用,所以本人参考了多篇博文查询许多相关资料终于搭建完成,中途遇到了很多困难,被我一一解决,分享出来希望能帮助到和我一样的小白。

由于我也是第一次使用,有些地方不是特别清楚,无法深入讲解,主要以如何搭建成功为主,也可能会说错,如有问题或者改进请在评论指出,感激不尽。

系统环境是OS X 10.8.2

首先我们先允许远程登陆以及共享:

系统偏好设置->共享,勾选文件共享,互联网共享和远程登陆



接下来创建一个新用户:

系统偏好设置->用户与群组,添加一个账户,账户名(可任意,不过大部分博文均指定该名称)就叫git,作为服务器账户,普通成员权限即可。本机还有个账户是boy15174(管理员权限,作为客户端账户)

http://www.koushikdutta.com/2009/04/setting-up-gitosis-server-on-os-x.html 该文章指出,你不应该在自己的自己的账户下运行gitosis,因为它会限制shell访问SSH,限制了gitosis-serve。

因为创建了普通权限的账户,所以无法使用sudo命令,使用时会报“xxx is not in the sudoers file.This incident will be reported.”错误

我们来做些修改,使它有sudo权限:

目标:找到sudoers文件,找到这行 root ALL=(ALL) ALL,在他下面添加xxx ALL=(ALL) ALL (这里的xxx是你的用户名),我们刚才创建的是git,所以添加一行git ALL=(ALL) ALL

http://blog.slogra.com/post-270.html 具体方法可以参考这篇

我这边另外提个不需要用命令行的方法。

先定位到sudoers文件,然后移动到其他任意文件夹,直接用编辑工具打开修改,再替换回去。

替换回去后去终端使用sudo命令会出sudoers文件权限相关的错误“sudo: no valid sudoers sources found, quitting”

参考我的这篇博文http://blog.csdn.net/boy15174/article/details/8644130 即可轻松解决,以后有其他系统文件出现权限问题均可用该方法解决。

接下来要正式开始了

主要参考 

http://blog.csdn.net/kesalin/article/details/6943770 

http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way/

http://weizhifeng.net/build-git-server-with-gitosis.html

http://rritw.com/a/bianchengyuyan/C__/20120810/202535.html

假设你已经安装了git和python,在终端输入

[plain] view
plaincopy

git --version  

python --version  

得到本机安装的版本



接下来会多账户,为了防止混淆,我来解释下终端下各个部分代表什么

boy15174deMac-mini: 本机的名字

~  当前所在的文件夹

boy15174 当前登陆的用户

$  分隔符

git --version 执行的代码

注:接下来操作均切换至服务器账户git

确认安装过必需组件以后,首先来获取gitosis,终端输入

[plain] view
plaincopy

git clone git://github.com/res0nat0r/gitosis.git  

如果下载失败,就换个地址,网上查下其他的,不过这是github的,应该不会有问题

接下来进行安装(终端的CD命令,可用finder的shift+command+g来重现,如果代码跳转比较头痛,可用该组合键进行可视化查看效果)

[plain] view
plaincopy

cd gitosis  

python setup.py install  

移动到gitosis目录下,用python脚本安装setup.py

完成后最后一行会出现:

[plain] view
plaincopy

Finished processing dependencies for gitosis==0.2  

该客户端的工作了,制作ssh rsa公钥:

如果你和我一样是一台机器2个账户的话,终端输入

[plain] view
plaincopy

su boy15174  

可以快速切换到指定账户,在这里,我们是boy15714作为客户端

这时候终端指令的开头部分变为bash-3.2$,注意区分

如果客户端和服务器不是同一台机器,则去准备作为客户端的机器

接下来均在在客户端账户执行

[plain] view
plaincopy

ssh-keygen -t rsa  

会让你输3次

这边我们都先留空,直接敲回车即可

完成后会出现如下代码和加密字符图片



我们要找到这个公钥

[plain] view
plaincopy

cd ~  

cd .ssh  

ls  

查看到.ssh目录下有

[plain] view
plaincopy

id_rsa        id_rsa.pub  

这两个文件,.pub后缀的就是公钥(英文public)
接下来想办法把这个公钥给服务器,不同机器的话,通过QQ,U盘,邮件都随意。

然后把公钥放到服务器 /tmp 目录下

因为是同一台机器,所以我们直接用代码将该文件从客户端账户复制到服务器账户即可(注意这边前缀还是bash-3.2$)

[plain] view
plaincopy

cp id_rsa.pub /tmp/boy15174.pub  

拷贝的时候,我们重命名了一下,为了便于区分。

公钥安放完毕后,使用ssh公钥初始化gitosis:

接下来的操作均切回服务器账户

[plain] view
plaincopy

exit  

同一台机器终端输入exit退出客户端账户。

[plain] view
plaincopy

sudo -H -u git gitosis-init < /tmp/boy15174.pub  

执行初始化操作命令,boy15174.pub替换为你刚才复制到服务器/tmp目录下的公钥

[plain] view
plaincopy

Initialized empty Git repository in /Users/git/repositories/gitosis-admin.git/  

Reinitialized existing Git repository in /Users/git/repositories/gitosis-admin.git/  

初始化成功后,会有如上两段代码。

在这里,会将该 client 当做认证受信任的账户,因此在 git 的 home 目录下会有记录,文件 authorized_keys 的内容与 yourname.pub 差不多。

我们可以定位到该文件查看一下

[plain] view
plaincopy

cd ~  

cd .ssh  

ls  

可以查看到authorized_keys文件

我们来修改一下post-update的权限,便于客户端提交

[plain] view
plaincopy

sudo chmod 755 /Users/git/repositories//gitosis-admin.git/hooks/post-update  

最后一步,修改git账户的PATH路径

[plain] view
plaincopy

touch ~/.bashrc  

echo PATH=/usr/local/bin:/usr/local/git/bin:\$PATH > .bashrc  

echo export PATH >> .bashrc  

cat .bashrc   

出现以下两行则修改完成。

[plain] view
plaincopy

PATH=/usr/local/bin:/usr/local/git/bin:$PATH  

export PATH  

至此,服务器端的搭建完成了。

接下来,我们使用客户端,返回到客户端那边。

验证下服务器是否已经连通

[plain] view
plaincopy

ssh git@192.168.1.101  

在客户端的终端输入远程登录到服务器的代码,对应你的服务器代码请去服务器 系统偏好设置->共享->远程登录 查看(如下图)



如果返回如下结果,证明已经连通:



注意,如果这边没有连通,不要着急,先跳过这步。

接着从服务器端复制资源到本地,在客户端输入如下代码(2选1):

[plain] view
plaincopy

git clone git@192.168.1.101:gitosis-admin.git  

[plain] view
plaincopy

git clone git@192.168.1.101:repositories/gitosis-admin.git  

如果上一步没有连通的情况,会出现如下错误:



注意看第3行,“bash: gitosis-serve: command not found”

gitosis-serve没有被找到!这是为什么,也正因为没有被找到所以无法连通。

这个问题困扰了我好久,然后我参考了以下几篇文章:

http://serverfault.com/questions/124607/cant-clone-gitosis-admin-git-local-from-my-snow-leopard-server-running-gitosis

http://blog.csdn.net/dqatsh/article/details/6280558

http://www.leoangel.cn/a/gitosis-build-note

然后得出的结果就是,因为最初看的几篇文章的年代较早,所以更新后文件的位置都有了变化,自然无法在本文之前设立的位置(PATH=/usr/local/bin:/usr/local/git/bin:$PATH)找到。

解决方法有几个

1.修改这个PATH路径 

定位到.bashrc 打开,将PATH替换成PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/local/git/bin:$PATH

2.软连接到新的路径 (本人未实测)

3.直接把gitosis-serve复制到目标路径(参考第一篇文章,不过也是最笨的方法)

定位到gitosis-serve文件(通过搜索,或者终端输入which gitosis-serve),然后把该文件直接复制到git账户的.ssh文件夹下

这回我们再验证一遍地址,就可以通了。

于是我们再次重复clone操作,成功!



我们已经把gitosis-admin从服务器clone到本地了。

进入目录,我们可以看到里面有一个文件和文件夹

gitosis.conf 该配置文件就是用来控制读写权限的,可以用文本编辑打开。

keydir 文件夹是存放ssh公钥的地方,所以之前我们重命名了公钥。

打开gitosis.conf ,可以看到如下的一段:

[plain] view
plaincopy

[gitosis]  

  

[group gitosis-admin]  

members = boy15174  

writable = gitosis-admin  

group代表一个组

members是此仓库的成员,只有成员才有权限读写,右边的组员名称就是公钥的名字。如果有多个成员,中间用空格分开。例如:

[plain] view
plaincopy

members = zhang3 li4 wang5  

writable是仓库名,即文件夹名。

注:我们以后修改权限都在本地进行编辑,然后push到服务器。

接下来我们在文件后面创建一个test组,然后保存上传。

[plain] view
plaincopy

[group test]  

members = boy15174  

writable = test  

然后我们切换到服务器账户,或者去服务器所在的机器。

终端进入到repositories目录,然后:

[plain] view
plaincopy

mkdir test.git  

cd test.git  

git --bare init  

创建一个test.git目录,进入到该目录,然后初始化成一个git镜像目录。

接下来返回客户端,我们可以用一个已有的项目或者创建一个新的项目。

这里我们从创建一个新项目开始,用已有的一个项目其实操作一样,相当于一个创建好的项目而已。

如果使用xcode,创建项目的时候记得在选择文件目录的地方下面创建本地git资源库打上勾就创建好新项目了。



不使用xcode的话,去任意目录,创建test文件夹,终端进入到该文件夹内,然后输入如下代码,就初始化完成了。

[plain] view
plaincopy

git init  

接下来,都是相同的步骤,已建好的就是进入到文件夹,在终端输入:

[plain] view
plaincopy

git remote add origin git@192.168.1.101:repositories/test.git  

git push -u origin master  

远程控制增加库到服务器根目录下repositories文件夹下的test.git仓库,将本地的分支推到远程的主分支。

其他git命令可参考http://www.cnblogs.com/cassvin/archive/2012/01/29/git_commands.html

到此,就把服务器的镜像和客户端的仓库连接起来了,可以用GUI的工具等等进行操作管理。

在MAC下,我们使用SourceTree或者使用xcode自带的git都行,关于工具的使用因为我也刚接触,所以暂不详细描述,以后有机会再补了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: