軟件需求:Git-core,gitosis, openssh-server, git-daemon-run(ubuntu),msysgit(windows)
Step1. 安裝配置Git服務(wù)器(IP:192.168.1.101)
? ? ? ? 安裝Git和openssh。
$ sudo apt-get install git-core openssh-server
新建用戶git,該用戶作為所有代碼倉(cāng)庫(kù)和用戶權(quán)限的管理者。
$ sudo groupadd git
? ? ? ? $ sudo useradd git –g git –m
$ sudo passwd git (需要設(shè)置用戶git的密碼)
Step2. 安裝gitosis
? ? ? ? 初始化服務(wù)器的全局設(shè)置,為安裝gitosis做準(zhǔn)備。在任何一臺(tái)機(jī)器上使用git,第一次必須要先設(shè)置user.name和user.email。
$ git config --global user.name “david”
$ git config --global user.email “david@server-pc”(name和email隨意)
安裝一下Python的setup tool。
$ sudo apt-get install python-setuptools
獲取gitosis包。?
$ git clone https://github.com/res0nat0r/gitosis.git(或者到網(wǎng)上下載對(duì)應(yīng)的gitosis)
$ cd gitosis
$ sudo python setup.py install
Step3. 配置gitosis
? ? ? ? 在git管理員的PC上,先安裝msysgit(windows系統(tǒng)),安裝后,打開gitbash,運(yùn)行如下命令生成管理員密鑰:
$ ssh-keygen –t rsa
運(yùn)行以上命令后,可以默認(rèn)提示直接回車?;剀嚭笤诋?dāng)前用戶目錄下生成了.ssh/id_rsa和.ssh/id_rsa.pub。其中.ssh/id_rsa是私玥,.ssh/id_rsa.pub是公鑰。接下來可以使用如下命令將git管理員的公鑰上傳到git服務(wù)器,也可以直接拷貝到git服務(wù)器。
$ scp xxx/.ssh/id_rsa.pub webgod@192.168.1.101:/tmp/id_rsa.pub
回到Git服務(wù)器上。
$ sudo chmod a+r /tmp/id_rsa.pub
讓gitosis運(yùn)行起來:
$ sudo –H –u git gitosis-init
Initialized empty Git repository in /home/repo/gitosis-admin.git/
? Reinitialized existing Git repository in /home/repo/gitosis-admin.git/
Gitosis是通過一個(gè)git倉(cāng)庫(kù)來管理配置文件,倉(cāng)庫(kù)放在/home/git/repositories/gitosis-admin.git。
? ? ? ? 設(shè)置git倉(cāng)庫(kù)權(quán)限
$ sudo chown git:git /home/git/repositories
$ sudo chmod 755 /home/git/repositories
$ sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
Step4. 在服務(wù)器上新建測(cè)試項(xiàng)目倉(cāng)庫(kù)
在服務(wù)器上新建一個(gè)空的項(xiàng)目倉(cāng)庫(kù)可,叫“test”。
切換到git用戶:
$ su – git
$ cd repositories
$ git init --bare test.git
$ exit
到這里,test只是一個(gè)空倉(cāng)庫(kù),它是不能clone下來的。為了能做clone,必須先讓管理員或有權(quán)限的人放一個(gè)初始化的版本到倉(cāng)庫(kù)中。所以,我們必須先修改一個(gè)gitosis-admin。
Step5. 管理gitosis的配置文件
Gitosis本身的配置也是通過git來實(shí)現(xiàn)的。在剛剛上傳公鑰(服務(wù)器端gitosis-init時(shí)使用了該公鑰)的機(jī)器上,把gitosis-admin.git這個(gè)倉(cāng)庫(kù)clone下來,就可以以管理員的身份修改配置了。
新建一個(gè)文件夾,如git101:
$ mkdir git101
$ cd git101
$ git clone git@192.168.1.101:gitosis-admin.git(或使用全路徑)
注:訪問git用戶倉(cāng)庫(kù)的默認(rèn)路徑是/home/git/repositories/
$ cd gitosis-admin
該目錄下的keydir目錄是用來存放所有需要訪問git服務(wù)器的用戶的ssh公鑰。各個(gè)用戶按照前面提到的辦法生成各自的ssh公鑰文件后,把所有人的ssh公鑰文件按名字重新命名一下,然后拷貝到keydir目錄下,然后修改gitosis.conf文件,做相應(yīng)的配置:
[gitosis]
? ? ? ? [group gitosis-admin]
? ? ? ? writable = gitosis-admin
? ? ? ? members = david@DAVID-PC? tom@TOM-PC
? ? ? ? [group team]
? ? ? ? writable = test
? ? ? ? members = david@DAVID-PC? tom@TOM-PC? pitter@PITTER-PC
這個(gè)配置文件表達(dá)了如下含有:gitosis-admin組成員有david,tom,該組對(duì)gitosis-admin倉(cāng)庫(kù)有讀寫權(quán)限;test組有david,tom,pitter三個(gè)成員,該組對(duì)test倉(cāng)庫(kù)有讀寫權(quán)限。目前這些配置文件的修改只是在本地,必須推送到遠(yuǎn)程的git服務(wù)器上才能真正生效。
加入新文件、提交并push到Git服務(wù)器:
$ git add .
$ git commit –m “add test and someusers”
$ git push origin master
Step6. 初始化測(cè)試項(xiàng)目
現(xiàn)在服務(wù)器搭建完畢,并且有一個(gè)空的項(xiàng)目test在服務(wù)器上。接下來,需要測(cè)試一下,空倉(cāng)庫(kù)是不能clone的,所以需要某個(gè)有寫權(quán)限的人初始化一個(gè)版本。在客戶端執(zhí)行:
$ mkdir test-ori
$ cd test-ori
$ git init (在客戶端執(zhí)行,初始化一個(gè)本地的版本庫(kù))
$ echo “/* add something */” > hello.c
$ git add .
$ git commit –m “initial version”
$ git remote add origin git@192.168.1.101:test.git
$ git push origin master
到此為止,test已經(jīng)有了一個(gè)版本了,team的其他成員只要先clone一下test倉(cāng)庫(kù)就可以了,而且gitosis.conf中賦予的讀寫權(quán)限。
Step7. 添加已有g(shù)it項(xiàng)目
如果想將一個(gè)現(xiàn)成的git倉(cāng)庫(kù),放到Git服務(wù)器上供team使用(比如clone了一個(gè)官方的kernel倉(cāng)庫(kù),想在內(nèi)部使用它作為基礎(chǔ)倉(cāng)庫(kù)),可以這樣操作:
首先需要從你的工作倉(cāng)庫(kù)中得到一個(gè)純倉(cāng)庫(kù),比如你的工作目錄為~/kernel,你想將該純倉(cāng)庫(kù)拷貝到Git服務(wù)器上使用。Git服務(wù)器的管理員拿到這個(gè)純倉(cāng)庫(kù)(~/kernel)后,將其拷貝到/home/repo/下,同時(shí)配置gitosis相關(guān)配置文件。比如說:下載ALSA庫(kù)。
$ git clone git://Android.git.kernel.org/platform/external/alsa-lib.git
$ git clone git://android.git.kernel.org/platform/external/alsa-utils.git
生成bare庫(kù):
$ git clone --bare alsa-lib alsa-lib.git
$ git clone --bare alsa-utils alsa-utils.git
將bare庫(kù)移動(dòng)到Git服務(wù)器目錄:
$ cp alsa-lib.git /home/repo
注意變更所有者,以獲取提交權(quán)限。
$ chown -R git alsa-lib.git
Step8. 安裝git-daemon
如果想使用git協(xié)議,那么就需要安裝git-daemon,它是git的一個(gè)守護(hù)進(jìn)程(作為一個(gè)服務(wù)存在)。
$ sudo apt-get install git-daemon-run
編輯git-daemon配置文件:
$ sudo gedit /etc/sv/git-daemon/run
#!/bin/bash
? ? ? ? exec2>&1
? ? ? ? echo‘git-daemon starting.’
? ? ? ? execchpst -ugitdaemon
“$(git--exec-path)”/git-daemon --verbose --export-all--enable=receive-pack --enable=upload-pack --enable=upload-archive --reuseaddr --base-path=/home/webgod/
說明:
? ? ? ? --base-path? ? ? 指向Git服務(wù)器的根目錄
? ? ? ? --enable=receive-pack
? ? ? ? --enable=upload-pack
? ? ? ? --enable=upload-archive
以上三個(gè)是與git-clone,git-push,git-pull相關(guān)的。查看詳情使用命令:$ man git-daemon查看。
重啟git服務(wù)器:
$ sudo sv restart git-daemon
在Git服務(wù)器上:
$ cd /home/webgod
$ mkdir RepoServer
$ cd RepoServer
$ git init --bare manifest.git
切換到其他目錄:
$ cd ~/test
$ git clone git://127.0.0.1/RepoServer/manifest.git
($ git clone git@127.0.0.1:/home/webgod/RepoServer/manifest.git)
這里就實(shí)現(xiàn)了所謂的“匿名訪問”。
[說明]:
1.如果其它新加入的成員無法clone一個(gè)git倉(cāng)庫(kù)時(shí),如出現(xiàn)如下錯(cuò)誤提示:
ERROR: gitosis.serve.main:Repositoryread access denied
原因是當(dāng)前成員的key命名與在gitosis.conf中的members中的名字不一致!例如所用的key名是 lxq_rsa.pub,而在gitosis.conf中某一group下所用的名稱為 lxq@ubuntu
則只需要把lxq_rsa.pub重命名為lxq@ubuntu.pub并重新push到服務(wù)器上即可!
2. 在克隆倉(cāng)庫(kù)時(shí)如果出現(xiàn)如下錯(cuò)誤提示:
fatal: ‘~/gitosis-admin.git’ does not appear to be a gitrepositories
fatal: The remote end hung up unexpectedly
試用 $ git clone git@192.168.1.101:/home/git/repositories/gitosis-admin.git
3.使用公鑰認(rèn)證的方式登錄。具體操作過程如下:
1) 在服務(wù)器端(server)創(chuàng)建一個(gè)賬號(hào)(公共),例如anonymous;
2) 管理員收集需要訪問git服務(wù)的用戶公鑰,如user1.pub、user2.pub;
3) 使用ssh-copy-id命令將各個(gè)git用戶的公鑰遠(yuǎn)程加入服務(wù)器(server)的公鑰認(rèn)證列表。
遠(yuǎn)程操作,可以使用ssh-copy-id命令:
? $ ssh-copy-id -I user1.pub anonymous@server
? $ ssh-copy-id -I user2.pub anonymous@server
如果直接在服務(wù)區(qū)上操作,則直接將文件追加到authorized_keys文件中:
? $ cat /path/to/user1.pub>> ~anonymous/.ssh/authorized_keys
? $ cat/path/to/user2.pub >> ~anonymous/.ssh/authorized_keys