之前項目組使用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 git@202.194.254.21: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文件的文件名tangtang@THINK.pub,拷貝到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,是不對的。