一、git服务器的软、硬件需求
硬件需求:
一台装有linux(redhat5.5_x86_64)的电脑,在公司局域网内有独立IP,并且保证小组每个人都能ping通;
软件需求:
git-core,gitosis, openssh-server, openssh-client。其中openssh-server,openssh-client在安装的redhat5.5_x86_64系统中已经默认安装,我们主要的工作是安装git-core和gitosis。如果在服务器没有联网的情况下安装git-core和gitosis,两软件存在复杂的依赖其他软件包的问题,给安装带来极大地不便,所以在此考虑服务器联网利用yum命令安装git-core和gitosis软件。接下来进行redhat5.5_x86_64系统的网络配置。
二、在redhat5.5_x86_64中配置网络
在服务器中设IP、子网掩码、网关、DNS如下:
IP:172.16.14.109
MASK:255.255.255.0
Gateway:172.16.14.1
DNS:172.16.35.20
三、安装git-core和gitosis
3.1、配置yum源
新安装的系统要使用yum,首先需配置yum的源。
rpm-ivh epel-release-5-4.noarch.rpm (32位)
rpm–ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm (64位)
3.2、利用yum安装git-core
首先,进行git-core的安装yuminstall git。
然后,给服务器新加用户git,该用户将作为所有代码仓库和用户权限的管理者:
#useradd -m git
为git设置密码:
#passwd git //git用户的密码是helloworld
建立一个git仓库的存储点,我放在了/Project/gitroot下,并且让除了git以外的用户对此目录无任何权限:
mkdir/Project/gitroot
chowngit:git /Project/gitroot
chmod700 /Project/gitroot
接着初始化一下服务器的git用户,这一步其实是为了安装gitosis做预备,当然在任何一台机器上使用git,第一次必须要初始化一下:
git初始化:
gitconfig --global user.name ”A”
gitconfig --global user.email ”A@B.com”
3.3、下载源码包安装gitosis
紧接着安装python的setuptool,这个也是为了安装gitosis做预备:
yuminstall python-setuptools
如果yum源中没有的话,就下载源码包,执行如下命令安装:
shsetuptools-0.6c11-py2.4.egg
然后,cd/tmp,执行gitclonegit://eagain.net/gitosis.git下载gitosis,但提示连接不上git://eagain.net/gitosis.git服务器,于是手动下载gitosis.tar.bz2软件包,并把它放到/tmp下解压
tar–jxvf gitosis.tar.bz2
cdgitosis
pythonsetup.py install
到此gitosis安装完成。
四、配置gitosis
4.1、创建git仓库链接
切换到git用户下:
sugit
默认状态下,gitosis会将git仓库放在git用户的home下,所以我们做一个链接到/Project/gitroot:
$ln-s /Project/gitroot/home/git/repositories
再次返回到默认用户
$exit
4.2、生成并配置ssh公钥
假如你将作为git服务器的管理员,那么在你的电脑上(另一台pc)生成ssh公钥:
[此处我们采用windows客户端msysGit-fullinstall,首先要 把此软件装在自己的计算机,然后进入shell去生成ssh公匙。
$ssh-keygen -t rsa -C "A@B.com"
一路回车,不用输入(表示默认路径,不用密码)!!
cd/c/Documents and Settings/Administrator/.ssh
会在该目录下生成id_rsa.pub文件,执行如下命令,将该文件(生成的公钥)拷贝到服务器的/tmp目录下,并给其他人以读权限:
scpid_rsa.pub git@172.16.14.109:/tmp
输入git用户的密码:helloworld
显示:
id_rsa.pub 100% 411 0.4KB/s 00:00
表示拷贝id_rsa.pub到git服务器的/tmp目录成功。
来到git服务器端,修改id_rsa.pub为全部用户可读
chmod a+r /tmp/id_rsa.pub //此处是在服务器端操作
4.3、运行gitosis
让gitosis运行起来:
sudo-H -u git gitosis-init < /tmp/id_rsa.pub
显示如下内容:
Initializedempty Git repository in /Project/gitroot/gitosis-admin.git/
Reinitializedexisting Git repository in/Project/ gitroot /gitosis-admin.git/
注:
如若使用git进行sudo操作,需要修改sudoers文件,参考文件:
http://blog.163.com/chenzhenhua_007/blog/static/12849264920113181557175/
gitosis的有趣之处在于,它通过一个git仓库来管理配置文件,仓库就放在了/Project/gitroot/gitosis-admin.git。
我们需要为一个文件加上可执行权限:
root@/home/git#cd repositories
root@/home/git/repositories# cd gitosis-admin.git/
root@/home/git/repositories/gitosis-admin.git#chmod755/Project/gitroot/gitosis-admin.git/hooks/post-update
(或者直接cdhooks ,chmod755 post-update,因为软链接关系)
root@/home/git/repositories/gitosis-admin.git#exit
五、在服务器上新建测试项目仓库
在服务器上新建一个空的项目仓库供大家测试一下,我们建了一个叫“teamwork”的仓库。切换到git用户:
git@/home/git$su git
$cd/Project/gitroot/HiviewDTV/
$mkdirteamwork.git
$cd teamwork.git
$gitinit --bare(注意,是两个-)
$exit
六、管理gitosis的配置文件
6.1、克隆gitosis-admin.git仓库
在自己的电脑里,把gitosis-admin.git这个仓库clone下来,这样你就可以以管理员的身份修改配置了。
在MING32的根目录下执行:mkdirwork,cdwork
gitclone git@172.16.14.109:/home/git/repositories/gitosis-admin.git
注:gitosis-admin.git仓库只有管理员才可以克隆!!
输入git用户的密码:helloworld
cdgitosis-admin/
该目录下有gitosis.config和keydir两目录,其中keydir是用来存放所有需要访问git服务器的用户的ssh公钥。组内各个用户按照前面提到的办法:在各自的git客户端—msysgit,生成相应的ssh公钥文件,然后把所有人的ssh公钥文件都拿来,按名字命名一下,比如A.pub,B.pub,等,统统拷贝到keydir目录下。
例如:cp/path/to/.ssh/id_rsa.pub ./keydir/b.pub
6.2、配置gitosi.conf文件
然后,打开文件gitosis.conf进行配置,配置文件内容大致如下:
[gitosis]
[groupgitosis-admin]
writable= gitosis-admin(写相对于/home/git/repositories的相对路径!!)
members= luzhonghui
[groupteamwork]
writable= ****/teamwork
members= A B
这个配置文件表达了如下含义:
gitosis-admin组成员有B,该组对gitosis-admin仓库有读写权限;
teamwork组成员有A,B两个成员,该组对teamwork仓库有读写权限;
6.3、push配置文件至gitserver
当然目前这些配置文件的修改只是在你的客户端--msysgit的本地,你必须推送到远程的gitserver上才能真正生效。
在git客户端--msysgit加入新文件、提交并push到git服务器//在客户端操作
/work/gitosis-admin$gitadd . ///注意此处的本目录·不要忽略了
/work/gitosis-admin$gitcommit -am “add teamwork prj and users”
/work/gitosis-admin$gitpush origin master
好了,现在服务器就搭建完了,并且有一个空的项目teamwork在服务器上。
七、初始化测试项目
7.1、初始化空仓库
搭建好的git服务器可以实现teamwork成员对teamwork.git仓库的资料进行简单的上传和下载功能。对搭建好的服务器的上传和下载功能进行测试,空仓库是不能clone的,所以需要某一个有写权限的人初始化一个版本。以下是在客户端完成。
/work$mkdir ****
/work/HviewDTV/$cd ****
/work$mkdir teamwork
/work$cd teamwork/
/work/teamwork$git init
注:这是在用户端的PC上执行的,为的是初始化一个本地的版本库,
只有管理员才可以执行该操作。
7.2、提交文件至空仓库
/work/…/teamwork$echo “hello,hiview!” > hello
/work/…/teamwork$gitadd .
/work/…/teamwork$gitcommit -am “initial version”
/work/…/teamwork$gitremote add origingit@172.16.14.109:/home/git/repositories/****/teamwork.git
/work/teamwork$git push origin master
以上均为管理员操作的,以下是项目组成员在各自客户端操作的!!
7.3、其他成员对仓库执行操作
到此为止teamwork已经有了一个版本了,teamwork的其他成员只要先clone一下teamwork仓库,就可以执行相应的操作了。
Windows客户端/work/HiviewDTV/目录下,执行
$gitclone git@172.16.14.109:/home/git/repositories/****/teamwork.git
注:
普通用户克隆的只是一个git仓库(不能克隆gitosis-admin.git仓库)
注:客户端克隆时不需要输入git的密码,因为其C:\DocumentsandSettings\Administrator\.ssh目录下生成的id_rsa私钥文件与其先前上交给管理员的id_rsa.pub公钥文件已经进行通信了!!
然后编辑hello文档,把编辑好的hello文档通过在git客户端mysisgit里执行以下命令
$git add .
$git commit -am “A add”
$git push origin master
上传到git服务器。
八、Git相关操作
8.1、客户端操作
8.1.1客户端安装
Windows系统下,可以使用客户端msysGit来进行Git操作。
直接双击安装文件进行安装,安装的路径为默认的:C:\msysgit,接下来到install,安装过程是git客户端--msysgit小系统编译的过程,编译过程大约需要20分钟,编译过后直接进入到msysgit的linuxshell界面。msysgit安装过程会检测windows系统的本机信息(如电脑用户名),msysgit客户端的linuxshell用户名就是安装过程中检测到的windows系统的本机用户名。
8.1.2生成个人公钥
$cd /F/workspace/
注:此命令意味着进入F盘workspace目录
$ssh-keygen -t rsa -C "A@B.com"//此命令生成公钥
Enterfile in which to save the key(**):
Enterpassphrase (****): 此处可不填,直接回车
Entersame passphrase again:回车
生成的id_rsa.pub交给管理员,由管理员开通权限。
8.1.3从gitserver上取代码
$gitconfig --global user.name "your-name"
$gitconfig --global user.email "your-email"
上述配置命令设定你的机器用户,在Git服务器中版本更改记录的更改人员信息就是这些。
$gitclone git@172.16.14.109:/home/git/repositories/git-test.git
从服务器取下代码,git在当前目录生成git-test目录,代码取下成功。
8.1.4回传代码至gitserver
$cdgit-test //即可看到代码目录树
$gitadd . // "."代表当前目录,不可省略
在对代码进行修改、添加等动作之后,把当前目录内容加入index
$gitcommit -am "initial version by wjt"
对代码修改做说明。
$gitpush origin master
代码上传回服务器。
8.2、帐号添加
GitServer帐号添加方式很简单,只需要team其他人员将在其本机客户端上生成的id_rsa.pub公钥文件交给管理员,为方便管理,管理员对该公钥文件进行改名(注:推荐改成各自邮箱前缀.pub,如luzhonghui.pub),然后再将其放入管理员本机的gitosis_admin/keydir/目录下即可。用户登录GitServer时,其提交的公钥文件会与其本机的id_rsa私钥文件进行通信,从而完成身份验证的任务。
8.3、帐号删除
GitServer帐号删除的方式也很简单,只需管理员删除其本机gitosis_admin/keydir/目录下相应人员的.pub文件即可。
8.4、密钥管理
普通用户在GitServer上上传、下载代码时不需要输入密码,只要在管理员的客户端gitosis_admin/keydir/目录下有普通用户提交的id_rsa.pub公钥文件,普通用户客户端上有私钥文件id_rsa,在GitServer上上传、下载代码时,两者(公钥文件和私钥文件)就会自动进行通信,从而验证登录者身份的有效性。
九.Git仓库的搬移(或链接)
9.1、设置搬移脚本
本地的GitServer搭建好后,如何将外部(例如,**)的Git仓库搬运(或链接)到我们的SwDataServer1服务器上呢?很简单,通过运行autosync.sh脚本,可以实现定时搬移(或链接)并同步外部(例如,**)的服务器!!
该脚本内容如下:
#!/bin/bash
echo"------------------------------------------------" >>/home/git/repositories/****/zsynclog #输入信息到log文件
forproj in linux-2.6.27 pmon multimedia toolchain
#对于linux-2.6.27 pmon multimedia toolchain等项目仓库
do
cd$proj.git
echo"`date +"%Y-%m-%d %H:%M:%S"`" >>/home/git/repositories/****/zsynclog#将更新时间输入到log文件
echo"start fetch $proj repo" >>/home/git/repositories//zsynclog#显示开始fetch仓库
gitfetch git@61.4.82.241:hisense/$proj.gitrefs/heads/windriver:refs/heads/windriver >>/home/git/repositories/HiviewDTV/zsynclog
#该命令最关键,表示获取风河的Git仓库
cd..
done
9.2、设置搬移脚本自动运行
通过crontab重复定时执行程序设置该脚本自动运行,切换到git用户,输入crontab–e会进入vi界面,输入:
50 * * * /home/git/repositories/HiviewDTV/autosync.sh
通过如下命令查看刚才的设置:
crontab–u git –l(列出git用户所有的定时配置,该配置在crontab文件中)
显示信息如下:
50 * * * /home/git/repositories/HiviewDTV/autosync.sh
表示在每天的凌晨12:05分,执行/home/git/repositories/HiviewDTV/目录下的autosync.sh脚本文件。
补充:
如果其它新加入的成员无法clone一个git仓库时,如出现如下错误提示:
ERROR:gitosis.serve.main:Repositoryread access denied
原因是当前成员的key命名与在gitosis.conf中的members中的名字不一致!
例如所用的key名是lxq_rsa.pub,而在gitosis.conf中某一group下所用的名称为lxq@ubuntu.pub,则只需要把lxq_rsa.pub重命名为lxq@ubuntu.pub并重新push到服务器上即可!
Reference:
http://www.cnblogs.com/xl19862005/archive/2011/06/28/2092464.html
http://www.rosoo.net/a/201102/10956.html
Ubuntu上的操作:
cd /home/luzhonghui
mkdir workspace
//要写相对路径,写绝对路径会导致AccessDenied!!
git clonegit@172.16.14.109:HiviewDTV/tokra_multimedia.git
//仓库只有一个,但是这仅有的一个仓库中,有hisense和windriver两个分支
//默认(origin)为hisense分支
//查看所有分支
git branch –a
//要查看风河仓库中的资料,需要切换到风河的分支
git checkout windriver
//将风河仓库中的资料拉下来
git pull
XP上的操作:
将新生成的liuxifu.pub添加到gitosis.conf后,克隆时要写绝对路径!!
git clonegit@172.16.14.109:/home/git/repositories/HiviewDTV/pmon4hisense.git
ubuntu上写相对路径,XP上写相对路径!!
细节:
生成key时,通过以下命令注册个人信息
#ssh-keygen -t rsa -C“xxx@gmail.com”
在进行任何操作之前,一定更要先:gitpull一下,拉下最新状态的git仓库
git pull默认包含gitmerge操作!!
如果不想要其自动gitmerge,要输入gitfetch,然后再手动输入gitmerge!!
git add .
git commit –am “”
git status//git status也要在相应的仓库里执行,因为要看下相应的仓库里是否有未尽事宜!!
git push(默认就是gitpush origin master)
当把一个仓库clone下来之后,一定要进入这个仓库后再执行:
git branch –a
git checkout windriver
因为分支都是在相应的仓库里的!!
XP,Win7下输入相对路径clone仓库时密钥不起作用的问题,之前原因出在:
gitosis.conf中相应仓库的成员名和keydir目录下的.pub文件的文件名不统一(例如keydir目录下为LiuXifu.pub,而gitosis.conf中pmon4hisense仓库下的成员为liuxifu,存在大小写区别)!!
在相应的git仓库下执行gitpull操作
做相应的修改后,先gitstatus,查看需要commit的文件及目录,然后gitadd 相应目录文件,如gitadd keydir/luzhonghui.pub,再gitstatus下查看状态,再gitpush!!
vimdiff查看两个文件的不同!!
安全的git使用方式:
git fetch origin master
git log -p master..origin/master
git merge origin/master
不要改动.pub文件的存储路径(ubuntu下默认为~/.ssh),否则的话,服务器会拒绝连接!!