使用Gitosis搭建Git服務(wù)器

軟件需求: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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容