开始用Git,但是老觉得公司的代码放上边不太放心,毕竟是商业性的代码。所以就搜索网上各位博主们如何搭建私有的git服务器来实现团队、公司内部的代码保存、协作,发现很多文章解释了步骤但是没有解释清楚原理,而且涉及到在多台电脑之间的操作切换,安装者基本的原理都没有搞清楚,就不知道什么东西该在什么地方做对应的配置,使得安装者不知道怎么安装成功、怎样算安装成功、安装成功后怎么用?基于对该问题的解决,为了避免后来者走弯路笔者遂挥毫记之,以便后来者看之、鉴之。

    言归正传:首先Gitosis系统中的作为一个代码、工程的同步平台所有存在多台电脑,每台电脑在Gitosis系统具有不同的角色,角色分别为:Gitosis服务器、Gitosis管理客户端、Gitosis普通客户端,Gitosis管理客户端也可以作为普通客户端登入,其中:

    (1)Gitosis服务器作为各git客户端(Gitosis普通客户端、Gitosis管理客户端)代码各版本代码上传、存储、同步下载的服务器。

    (2)Gitosis管理客户端作为初始客户端,Gitosis服务器根据Gitosis管理客户端生成的公钥进行git服务器初始化;远程配置并以git上传的方式在Gitosis服务器上创建团队工程、添加普通客户端公钥到keydir使之具有免密访问的前提、配置每个工程对应的每个客户端的访问权限(包括Gitosis管理客户端,因为在后续的日常使用中其也可以作为Gitosis普通客户端接入)。

    (3)Gitosis普通客户端,产生公钥-私钥对,并拷贝其公钥给Gitosis管理客户端并在Gitosis管理客户端相应的配置具有对应项目的协作权限。

    我相信,大家能看到这个网页的已经搜索了很多网站了,其它网站只牵强的讲了步骤,而没有做出如此详细的解释,导致很多人即使有正确的安装配置步骤也无法正常安装、或者安装正确了也无法确定是否安装正确,因此看了上述描述之后有安装流程的各位应该知道怎么安装了吧!?但即便如此,也仅仅是知其然,虽然清晰的知其然也仅仅是知其然,而为什么Gitosis系统要如此设计?为何所以然?仍然不清楚。因此针对其设计思想以及详细步骤我进一步的为各位做出描述:

    哥当前的情况是在Ubuntu14.04安装并设置gitosis服务器(后面简称“U服务器”),在win10上安装git bash的客户端,两台win10电脑一台作为gitosis管理客户端和Gitosis普通客户端(后面简称“A管理主机”),另外一台仅仅作为gitosis普通客户端(后面简称“B普通主机”),并以在此三台电脑间的安装、操作来进一步准确地解释gitosis如何安装、怎样算安装好了、安装好了怎么使用。

    服务器架设步骤:(服务器:ubuntu 14.04):

    (1)<在U服务器>ubuntu系统是默认安装有python的,但是gitosis是通过Python来安装的,并且依赖于python-setuptools工具,因此先安装python的该工具:

         sudo apt-get install python-setuptools    

    (2)<在U服务器>下载并安装gitosis

    新建或者选定一个文件夹 exp: ~/src

    cd ~/scr

    git clone https://github.com/res0nat0r/gitosis.git (连接如果失效自己去Google)

    cd gitosis

    python setup.py install

    (3)<在U服务器>添加用户git

    sudo adduser \

        --system \

        --shell /bin/sh \

        --gecos 'git version control' \

        --group \

        --disabled-password \

        --home /home/git \

        git

    (4)<在A管理主机>由于需要根据Gitosis管理客户端生成的公钥来初始化Gitosis服务器端(A管理主机)上的gitosis(或者说Gitosis服务器端正是因为用“A管理主机”生成的公钥初始化才使得“A管理主机”成为“gitosis管理客户端”),故而需要在A管理主机上生成密钥对。

        if(A管理主机.systemType == windows):

            应该安装git bash,在git bash下:

            ssh-keygen -t rsa   这个windows下的git bash如何安装就别问哥,我们说问题关键

            一路回车产生  id_rsa(私钥)与id_rsa.pub(公钥)文件

        else if(A管理主机.systemType == Linux)://这个其实我没有试过,但是你们可以试一试

            直接在命令行:

            ssh-keygen -t rsa

            一路回车产生  id_rsa(私钥)与id_rsa.pub(公钥)文件

        

        拷贝id_rsa.pub文件到U服务器的/tmp/文件下   //很多情况下还是相信U盘吧!

    (5)<在U服务器>初始化gitosis

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

    (6)<在U服务器>修改post-update权限

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

    很多U服务器上的路径不一定是这个,这种情况下就:find / -name post-update

    相信我,相信路易斯,你可以找到!

    (7)<在A管理主机>虽然在[U服务器]已经以[A管理主机]的公钥完成gitosis初始化之后,由于需要在[A管理主机]对[U服务器]进行配置,故而需要从[U服务器]克隆gitosis-admin.git到[A管理主机],以便做进一步配置:

    git clone git@主机名:gitosis-admin.git    //其中主机名可以为[U服务器]在局域网的IP

    cd gitosis-admin.git

    进入[A管理主机]gitosis-admin.git对[U服务器]的各个工程、各个工程的访问权限进行进一步管理。

    比如,在[A管理主机]上分配John的对foo项目的权限:

    在gitosis-admin.git下存在gitosis.conf(文件)  keydir/(目录)

    从[B主机]上拷贝[B主机]生成的公钥(在B主机上生成公钥的过程参考步骤<4>)到[A管理主机]上,将公钥以[B主机]的名字命名拷贝到[A管理主机]的gitosis-admin.git/keydir/之下,其中[B主机]的名字可以参考生成公钥末尾的主机名:  xxxx@xxxx。

    进一步地配置gitosis.conf,在没有配置gitosis.conf文件的时候,该文件内容为:

    “

    [gitosis]


    [group gitosis-admin]

    members = JewGrunhia@DESKTOP-OAR2S8U

    writable = gitosis-admin

    ”其中group代表[A管理主机]管理的Gitosis服务器上工程的群,该group为项目管理群 gitosis-admin,管理群的成员members仅仅有哥的管理主机名:JewGrunhia@DESKTOP-OAR2S8U,其权限为对gitosis-admin可以进行修改,从这儿可以看出gitosis开发者的设计思想,即gitosis管理者与普通的gitosis用户没有根本的区别,只是具有更大的权限来修改gitosis-admin项目本身而已。

    创建新的项目群后的gitosis.conf文件如下:

    “

    [gitosis]


    [group gitosis-admin]

    members = JewGrunhia@DESKTOP-OAR2S8U

    writable = gitosis-admin


    [group foo]

    writable = foo

    members = JewGrunhia@DESKTOP-OAR2S8U Jew Jewgrunhoa@DESKTOP-782FAJJ JewGrunhoa

    ”

    新的项目名为foo,可以修改的项目为foo项目,可以访问并修改该项目的人员(member)为:

    JewGrunhia@DESKTOP-OAR2S8U、Jewgrunhoa@DESKTOP-782FAJJ

    其中JewGrunhia@DESKTOP-OAR2S8U本身即为Gitosis管理主机,在此加入后亦可以作为Gitosis客户端加入foo项目的协作。Jewgrunhoa@DESKTOP-782FAJJ是哥的另外一台电脑,当然,对应的.pub公钥文件以“JewGrunhoa.pub”的名字拷贝到gitosis-admin.git/keydir/之下。

    待gitosis.conf内容修改和keydir/目录下的公钥添加完成后,在[A管理主机]的gitosis-admin.git下输入命令:

    git add .

    git commit -am "Add foo's Memeber!"

    git push

    从而使得[A管理主机]配置的内容同步到[U服务器],从而在gitosis服务器上foo下添加了JewGrunhia@DESKTOP-OAR2S8U、Jewgrunhoa@DESKTOP-782FAJJ两台主机的访问、修改权限。


    各gitosis客户端可以访问、修改在gitosis服务器上允许其访问的工程,进一步的貌似只有gitosis管理客户端可以在gitosis服务器上创建项目(其它的普通gitosis客户端行不行还没有试),使用JewGrunhia@DESKTOP-OAR2S8U(本次使用中的gitosis管理客户端)添加项目foo,步骤如下:

    mkdir foo

    cd foo

    git init

    touch hellokitty.txt

    git add .

    git commit -am 'first commit'

    git remote add origin git@192.168.0.108:foo.git   

    //192.168.0.108为gitosis服务器在局域内的IP地址

    git push origin master

    从而在gitosis服务器上创建foo项目。


    进一步的,在<B主机>即gitosis普通客户端上访问该项目的方法为:

    git clone git@192.168.0.108:foo.git

    cd foo

    修改foo/下的hellokitty.txt文件内容

    git commit -am 'Change hellokitty.txt' && git push

    从而完成对foo.git中hellokitty.txt文件的修改并同步到gitosis服务器。

    

    剩下的Google一下就非常容易搞定了

    补充:

    有些操作不写真的很容易忘记,为了方便自己回来查看,我来补充一些从gitosis同步最新文件的方式,我常用的方法如下:

    <在git普通客户端、或者可以作为普通客户端的git管理客户端、git服务器>

    git fetch origin master:temp

    git diff temp    //比较master分支和temp分支的不同

    git merge temp    //合并temp分支到master分支

    git branch -d temp    //删除temp

    

    (⊙o⊙)…,这就可以了,然后你没看错git服务器如果向git管理主机提自己产生的公钥也可以像git普通客户端那样具有项目访问、修改、提交的权限,但是这样就与gitosis开发者的意图南辕北辙了,为啥?人家这样搞为的就是你把gitosis服务器架设在阿里云之类的第三方服务器上,服务器上存储都是加密后的代码,托管平台方根本无法获取你的数据,这保证了开发者的IP安全还可以随时随地的git同步的自己的代码库。我呢,因为服务器是我自己的,所以没关系啦!