之前项目组使用svn做版本控制,尝试了一下git+svn(就是git客户端+svn服务器配置),但总感觉无法将git的强大功能体现出来,于是打算在服务器上配置git server并且给出eclipse egit插件客户端的操作。本文参考了ubuntu官网以及部分网友的blog,文中如引用均给已出相应连接。
1.配置环境
客户端
笔记本:Thinkpad T400
内存:6GB 1067MHz DDR3
OS : Window 7 professional 64bit sp1
Eclipse : Indigo (Java EE)
服务器
OS : Ubuntu 9.10 (Karmic) Server
2.服务器环境
由于服务器使用Ubuntu 9.10版本较低,在使用apt-get install git-core时提示要使用apt-get update。不过在apt-get update的时候报了很多错误,查了一下,原因是8.10,9.04,9.10,10.10等版本官方均已经停止更新,需要修改sources.list文件(/etc/apt/sources.list),改为
deb http://old-releases.ubuntu.com/ubuntu/ karmic main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic main restricted
deb http://old-releases.ubuntu.com/ubuntu/ karmic-updates main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-updates main restricted
deb http://old-releases.ubuntu.com/ubuntu/ karmic universe
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic universe
deb http://old-releases.ubuntu.com/ubuntu/ karmic-updates universe
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-updates universe
deb http://old-releases.ubuntu.com/ubuntu/ karmic multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic multiverse
deb http://old-releases.ubuntu.com/ubuntu/ karmic-updates multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ karmic-updates multiverse
然后使用apt-get update,不过old-releases.ubuntu.com访问速度非常慢而且没有镜像,所以可能需要执行很长的时间(我花了大概4个小时,郁闷)。更新完成后,可以进行后续安装了。
当然如果你使用的ubuntu版本高于10.10,那可以跳过步骤2,直接进入3。
3. git服务器
第3部分主要参考了ubuntu官网Git服务器Gitosis安装设置,红字部分是个人补充
3.1、安装 openssh服务器
sudo apt-get install openssh-server openssh-client
3.2、创建个人公钥和私钥 (如果在服务器下,会以当前用户名创建)
在默认用户的主目录路径下,运行以下命令,按照提示创建公钥和私钥
ssh-keygen -t rsa
默认生成2048位,如果需要提高安全级别,也可以通过下面的命令创建公钥和私钥
ssh-keygen -t rsa -b 4096
默认情况下,公钥和私钥会保存在~/.ssh目录下,如下所示:
id_rsa id_rsa.pub known_hosts
3.3、安装 git服务器
sudo apt-get install git-core
3.4、配置 git服务器
创建git服务器管理用户
sudo useradd -m git sudo passwd git
创建git仓库存储目录
sudo mkdir /home/git/repositories
设置git仓库权限
sudo chown git:git /home/git/repositories sudo chmod 755 /home/git/repositories
初始化全局设置
git config --global user.name "myname" git config --global user.email "myname@server"
3.5、安装python的setup tool
sudo apt-get install python-setuptools
3.6、获取并安装gitosis
cd /tmp git clone git://eagain.net/gitosis.git此处git地址已经失效,网上给出其他的也不能clone,没办法下载gitosis打包文件,解压继续。
cd gitosis sudo python setup.py install
3.7、配置gitosis
cp ~/.ssh/id_rsa.pub /tmp sudo -H -u git gitosis-init < /tmp/id_rsa.pub
执行后在/home/git/repositories/下会出现gitosis-admin.git文件夹,gitosis同样使用git来进行管理,因此我们需要git clone后修改,并执行commit和push使配置生效 sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
3.8、管理gitosis配置
cd ~ git clone git@hostname:用户名/gitosis-admin.git 此处应改为git clone git@hostname:gitosis-admin.git,也不要写成git clone [email protected]:home/git/repositories/gitosis-admin.git否则会报gitosis.serve.main:Repository read access denied。这个错误我一开始一直认为是gitosis.conf中的配置有问题,实际上是路径问题
cd gitosis-admin/
各个用户按照前面提到的办法生成各自的ssh公钥文件后,服务器管理员把所有人的 ssh公钥文件都拿来,拷贝到keydir目录下。
在linux和mac下可以使用scp命令远程拷贝,在window下,可以使用winscp(图形界面),注意生成的pub文件用文本编辑器打开取文件内容最后显示的完整用户名, 比如我的tangtang@THINK,作为pub文件的文件名[email protected],拷贝到keydir目录下
修改gitosis.conf文件,如下所示
[gitosis] [group gitosis-admin] writable = gitosis-admin members = tracker@issue-tracker
[group developers] writable = helloworld
members = tangtang@THINK b@server2
[group test] readonly = helloworld members = c@server3
这个配置文件表达了如下含义:gitosis-admin组成员有tracker@issue-tracker,该组对gitosis-admin仓库有读写权限; developers组有tangtang@THINK,b@server2两个成员,该组对undergraduate仓库有读写权限; test组有c@server3一个成员,对helloworld仓库有只读权限。 当然目前这些配置文件的修改只是在你的本地,你必须推送到gitserver上才能真正生效。 加入新文件、提交并push到git服务器:
这里首先确保在git clone后的gitosis-admin/文件夹下,使用
git add . git commit -am "add users" git push
经过以上步骤,服务器配置完毕
4.创建git项目
下面我们在客户端创建git项目,并push到服务器上,这里eclipse的egit插件好像在创建git项目时有问题,所以我们仍然使用git命令行形式
mkdir helloworld
cd helloworld
git init
touch a.txt
git add .
git commit –am “add a.txt”
git remote add helloworld git@hostname:helloworld.git
git push helloworld master
成功后会显示
Initialized empty Git repository in /home/tangtang/helloworld/.git/
Enter passphrase for key '/home/tangtang/.ssh/id_rsa':
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 24 (delta 5), reused 4 (delta 0)
Receiving objects: 100% (24/24), done.
Resolving deltas: 100% (5/5), done.
此时,hellworld已经被push到git server上
5. window eclipse git配置
eclipse下egit插件安装比较简单,选择Help->Install New Software输入http://download.eclipse.org/egit/updates,按照提示安装即可
5.1 选择File->Import->Git/Projects from Git
5.2 Select a Git Repository 选择Clone 在URI中输入ssh://git@hostname/home/git/repositories/helloworld.git 或者git@hostname:/home/git/repositories/helloworld.git 注意这里不能使用在git命令行下使用的git@hostname:helloworld.git,否则总是报错,现在不确定是否是因为window的原因(抽空用mac os试下)
5.3 Branch Selection
5.4 Local Destination
Finish后从git server clone项目,直至完成
5.5 Git Repositories 查看本地及remote状态(Window->Show View->Other->Git Repositories)
可以看到Remotes/origin下有Fetch和Push两个路径,注意Fetch的配置
红框部分是要求把remote origin下的所有分支都fetch到本地
然后是Push的配置
5.6
如果使用了私钥,可以进行如下配置
如果不使用ssh的话,我发现在没有安装window的eclipse下也能正常使用,不知道git是否通过别的协议传输(没有配置http以及https),这点没有搞清楚,还请大家不吝赐教。
配置完毕后,我们可以通过使用eclipse egit插件进行源代码管理了
[Update 1 2013-01-08]
1 3.7使用的是服务器上的公钥创建gitosis-admin仓库,默认就是gitosis-admin的管理员了,但实际上我们可以通过修改gitosis-admin/gitosis.conf 文件添加客户端的管理员
比如
[group gitosis-admin]
writable = gitosis-admin
members = admin tangtang
2 创建公钥密钥的方式
重点说一下window,在window下,因为我们访问openssh server,所以必须使用openssh兼容的格式,这里如果你安装了msysgit 可以使用
ssh-keygen -t rsa -C "yourname"生成用户名为yourname的公钥和密钥,这里建议使用-C参数(否则会生成yourname@机器名的公钥密钥,后面我不管怎么设置均无法成功登陆)
把生成的id_rsa.pub复制一份,更名为yourname.pub 并通过winscp 到 你提前在服务器上clone的那个gitosis-admin仓库的keydir文件夹下,然后执行git commit和git push。当然如果你在客户端已经可以操作gitosis-admin的话,亦可以放到客户端的gitosis-admin的keydir下并同样执行git commit 和git push
3 当你使用客户端工具比如git extension等克隆仓库时,注意仓库的url 应该是 ssh://git@remote-server-url/repositoryname.git 我之前总是把git用户名设置为之前创建的yourname,是不对的。