gitosis:
把所有用戶的公鑰保存在 authorized_keys 文件的做法,只能湊和一陣子,當用戶數量達到幾百人的規模時,管理起來就會十分痛苦。每次改刪用戶都必須登錄服務器不去說,這種做法還缺少必要的權限管理 — 每個人都對所有項目擁有完整的讀寫權限。
簡單地說,Gitosis 就是一套用來管理 authorized_keys 文件和實現簡單連接限制的腳本。有趣的是,用來添加用戶和設定權限的并非通過網頁程序,而只是管理一個特殊的 Git 倉庫。你只需要在這個特殊倉庫內做好相應的設定,然后推送到服務器上,Gitosis 就會隨之改變運行策略
安裝配置git
- root@development 為服務器端 ,ip為:192.168.4.26
- iMACdeiMac:~ root 為服務器管理員
1.安裝git和openssh。在當前用戶下執行如下命令安裝git和openssh:
root@development:~# sudo apt-get install git-core openssh-server openssh-client
git-core是git版本控制核心軟件
安裝openssh-server和openssh-client是由于git需要通過ssh協議來在服務器與客戶端之間傳輸文件
如果安裝提示失敗,可能是因為系統軟件庫的索引文件太舊了,先更新一下就可以了,更新命令如下:
sudo apt-get update
2.配置git用戶與創建git倉庫的存儲目錄:
- 創建所有代碼倉庫和用戶權限的管理者git,并更改用戶的密碼。在當前用戶下執行:
root@development:~# sudo passwd git```
useradd會在ubuntu上增加一個git用戶
- 創建git倉庫的存儲目錄、更改文件目錄屬主為代碼倉庫的管理者git,只讓git用戶對此目錄有權限。本文檔以/home/repo目錄做為git倉庫的存儲目錄。在當前用戶下執行:
root@development:~# sudo mkdir /home/repo
root@development:~# sudo chown git:git /home/repo
root@development:~# sudo chmod 700 /home/repo
安裝配置gitosis
1.安裝gitosis前準備
- 初始化git用戶。在任何一臺機器上使用git,第一次必須初始化一下。在當前用戶下初始化全局的git信息(用戶名和郵箱隨便填寫都可以,只是為了讓git識別git用戶而已):
首先查看一下是否存在了git用戶執行命令:
root@development:~# cat ~/.gitconfig
若已有git用戶,最好刪除了重新初始化,我搭建時就是因為用了已有的git用戶,后面搭建出問題了,刪除命令:
root@development:~# sudo userdel -r git
初始化git命令:
root@development:~# git config --global user.name "jackliu"
root@development:~# git config --global user.email "xcltl618@gmail.com"
2.安裝python的setup tool。在當前用戶下執行如下命令安裝:
/tmp是Ubuntu各種安裝包與文件的存放的目錄
root@development:~# cd /tmp
克隆下載gitosis包:
root@development:/tmp# git clone https://github.com/res0nat0r/gitosis.git
進入gitosis目錄:
root@development:/tmp# cd gitosis
安裝gitosis:
root@development:/tmp/gitosis# sudo python setup.py install
3.默認狀態下,gitosis會將git倉庫放在 git用戶的home下,所以我們做一個鏈接到/home /repo,su到git用戶,執行如下命令:
root@development:/tmp/gitosis# su git
git@development:/tmp/gitosis$ ln -s /home/repo /home/git/repositories
然后退出git用戶:
git@development:/tmp/gitosis$ exit
4.配置gitosis。如果你是git服務器的管理員,在你的計算機上(最好是另一臺PC)來生成訪問git服務器的ssh公鑰,然后將生成的公鑰拷貝到git服務器,執行相關命令來允許你用個人的計算機進行訪問和管理git服務器。本文檔以mqt@iMACdeiMac.local來做為遠程訪問和控制git服務器的管理用戶。如果另外一臺電腦還是linux的電腦,還要在linux上安裝上git(傳送下載地址http://git-scm.com/downloads),并且初始化用戶git config那兩句命令
如果是linux 或 蘋果系統,在此計算機上的/home/git目錄下(隨便一個目錄都行)
- 在你的PC上選擇一個用戶做為遠程訪問及管理git服務器的用戶,同時并生成ssh公鑰。在選中的用戶的home下,執行如下命令:
iMACdeiMac:~ root# ssh-keygen -t rsa
一直回車就行了,不需修改文件名
- 接著,將生成的公鑰拷貝到服務器的/tmp下,注意要把改成git服務器對應的IP地址:
為了保險一點,你最好去看看服務器端/tmp目錄下是否有id_rsa.pub,若有,把它刪除了
iMACdeiMac:~ root# scp .ssh/id_rsa.pub git:192.168.4.26/tmp
輸入服務器登錄密碼,拷貝成功,如下圖:
Paste_Image.png
如果拷貝不成功,你也可以直接用U盤拷貝id_rsa.pub到這臺服務器上到/tmp目錄下,最壞的情況是不能拷貝的話,可以在服務器的/tmp下創建一個id_rsa.pub文件,內容為:git服務器的管理員的id_rsa.pub里的內容(即剛才生成的id_rsa.pub文件的內容)
- 回到git服務器/tmp/gitosis目錄,執行:
root@development:/tmp/gitosis# sudo chmod a+r /tmp/id_rsa.pub
- 在git服務器上執行如下命令,讓gitosis運行起來:
root@development:/tmp/gitosis# sudo -H -u git gitosis-init < /tmp/id_rsa.pub
會出現如下信息:
Initialized empty Git repository in /home/repo/gitosis-admin.git/
Reinitialized existing Git repository in /home/repo/gitosis-admin.git/
- gitosis通過一個git倉庫來管理配置文件,倉庫放在/home/repo/gitosis- admin.git。我們需要為一個文件加上可執行權限,以root用戶登錄(我操作是一直是以root用戶的):
root@development:/tmp/gitosis# cd /home/git/repositories
root@development:/home/git/repositories# cd gitosis-admin.git/
root@development:/home/git/repositories# sudo chmod 755 /home/repo/gitosis-admin.git/hooks/post-update
然后退出(退不退root無所謂):
root@development:/home/git/repositories# exit
在git服務器上搭建測試項目庫
1.建立倉庫名“test”的測試倉庫。在git服務器上切換到git用戶,執行如下命令建立測試倉庫:
root@development:/home/git/repositories/gitosis-admin.git# su - git
git@development:~$ cd /home/repo
git@development:/home/repo$ mkdir test.git
git@development:/home/repo$ cd test.git
git@development:/home/repo/test.git$ git init --bare
git@development:/home/repo/test.git$ exit
到目前為止,這只是一個空倉庫,空倉庫是不能clone的。為了能clone,我們必須先讓某個有權限的人放一個初始化的版本到倉庫
中。所以,我們必須先修改一下gitosis-admin。此時需要 管理gitosis的配置文件。
2.gitosis本身的配置也是通過git中的gitosis-admin.git來實現的。
- 克隆gitosis-admin.git倉庫。在git管理員用戶目錄下,把gitosis-admin.git這個倉庫clone下來,接下來我們可以用管理員的身份修改配置了。
在git管理員用戶目錄執行:
iMACdeiMac:~ root# cd /Users/imac/Documents/gtis
我把gitosis-admin.git放在/Users/imac/Documents/gtis這個目錄下
iMACdeiMac:gtis root# git clone git@192.168.4.26:gitosis-admin.git
在windows電腦上git base下一樣執行這個克隆命令
如果出現:fatal: '~/gitosis-admin.git' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
改成: sudo git clone git@192.168.4.26:/home/repo/gitosis-admin.git
- 拷貝需要訪問git服務器的開發用戶的ssh公鑰 獲取倉庫后,執行:
進入到剛剛克隆的管理倉庫
iMACdeiMac:gtis root# cd gitosis-admin/
該目錄下的keydir目錄是用來存放所有需要訪問git服務器的用戶的ssh公鑰:各個用戶按照前面提到的辦法生成各自的ssh公鑰文件后,把所有人的ssh公鑰文件都拿來,按名字命名一下(#### 注意:在各個用戶機上生成ssh公鑰時不要修改文件名,粘貼到gitosis-admin下的keydir目錄才修改文件名####),比如b@pc1.pub, lz@pc2.pub等,統統拷貝到keydir下:
iMACdeiMac:gtis root# su root //蘋果系統下執行 sudo su - root
iMACdeiMac:gtis root# cp /path/.ssh/id_rsa.pub ./keydir/b@pc1.pub
iMACdeiMac:gtis root# exit
然后看看keydir目錄下是否有b@pc1.pub,若這樣的命令復制粘貼不行,直接手動復制粘貼到keydir目錄下也行,windows下直接復制粘貼
- 修改gitosis.conf文件
[group gitosis-admin] # 組名稱(可隨意起)
members = mqt@iMACdeiMac.local b@pc1 #組員 :配置了兩個服務器管理員,mqt@iMACdeiMac.local 和 b@pc1,因為gitosis-admin 項目是配置權限用的
writable = gitosis-admin # 組員對項目gitosis-admin有讀寫權限
[group hello] # 組名
members = mqt@iMACdeiMac.local b@pc1 # 為test項目配置兩個組員
writable = test # 組員對項目test有讀寫權限
如果想為一個用戶只配置讀權限,而沒有寫權限,在文件上添加:
[group hello]
members = b@pc2
readonly = test # 組員b@pc2對項目test只有讀權限
注意:members = keydir目錄下.pub文件名,否則沒有訪問權限
目前這些配置文件的修改只是在你的本地,你必須推送到遠程的gitserver上才能真正生效。 加入新文件、提交并push到git服務器:
iMACdeiMac:gitosis-admin root# git add .
iMACdeiMac:gitosis-admin root# git commit -am “add test prj and users”
iMACdeiMac:gitosis-admin root# git push origin master
gitosis.conf 文件的修改,起到的作用是:
gitosis-admin組成員有 mqt@iMACdeiMac.local, b@pc1, 該組對gitosis-admin倉庫有讀寫權限;
hello組有mqt@iMACdeiMac.loca, b@pc1兩個成員, 該組對test倉庫有讀寫權限
測試搭建的項目庫
- 服務器搭建完了,并且有一個空的項目test在服務器上。接下來測試一下,空倉庫是不能clone的,所以需要某一個有寫權限的人初始化一個版本。 下面是在b@pc1客戶端完成:
mkdir test-ori
cd test-ori/
git init
echo “/*add something*/” > hello #創建一個說明文件
git add .
git commit -am “initial version”
git remote add origin git@192.168.4.26:test.git
git push origin master
這些命令一個都不能漏,到此,test已經有了一個版本了,test倉庫的其他成員只要先clone一下test倉庫,就可以進行倉庫的開發了。下面是一個用戶b來克隆test:
su b
cd /home/b
git clone git@192.168.4.26:test.git
cd teamwork
vim hello
git add .
git commit -am “b add”
git push origin master
exit
使用圖形界面git(SourceTree)
- 拿到URL地址直接克隆倉庫,以test.git為例:
現有項目上傳
- 這個更簡單,像創建test.git倉庫一樣,初始化倉庫后,克隆本地倉庫后把項目放到本地倉庫再推送到服務器就ok了
配置gitweb
- 待定。。。。