1. 程式人生 > >Ubuntu 11 10 server 安裝Git 伺服器

Ubuntu 11 10 server 安裝Git 伺服器

因為後面要採用Git代替Subversion,花了點時間配置了Git服務端和客戶端,像以前一樣,仍然基於最新的Ubuntu11.10 server/desktop系統。

感謝這幾篇文章的作者:

http://www.hackido.com/2010/01/installing-git-on-server-ubuntu-or.html

同時參考一下:

http://www.debuntu.org/ssh-key-based-authentication 這篇文章介紹了SSH公鑰和私鑰的生成方法。

這篇文章裡面介紹了新加使用者的部分補充了第一篇文章的不足。

http://www.jiangmiao.org/blog/1600.html

這篇文章介紹了ssh-keygen命令的引數

http://lamp.linux.gov.cn/OpenSSH/ssh-keygen.html

 

我的安裝步驟主要來源於上面引用的第一篇文章,並補充不足之處(比如原文第6條作者沒說清楚)。

注意,Git是分散式管理工具,因此沒有真正的Server,本文用了三臺機器,分別是

S1 代表 機房裡面的Ubuntu 11.10 server

C1 代表 第一臺擁有管理許可權的 Ubuntu desktop

C2 代表 後來被新增進來的擁有管理許可權的Ubuntu desktop

三臺機器都可以看作是伺服器。只是從方便人使用的角度,總是將專案檔案提交到S1上,並從S1上獲得最新專案檔案。

 

1.Ubuntu server安裝Git服務程式

下文稱這臺Ubuntu server為S1

 

sudo apt-get install git-core

2.S1上安裝Gitosis程式.

 

Gitosis是一個工具程式,可以幫助我們進行Git倉庫的訪問控制和遠端管理。

 

sudo apt-get install python-setuptools
mkdir ~/src
cd ~/src
git clone https://github.com/res0nat0r/gitosis.git
cd gitosis
sudo python setup.py install

 

 

3.S1上建立一個git帳號。

沒有密碼。這個帳號是給Gitosis程式使用的。

 

sudo adduser \
  --system \
  --shell /bin/sh \
  --gecos 'git version control' \
  --group \
  --disabled-password \
  --home /home/git \
  git


 

4.安裝遠端管理客戶端

下文將第一個遠端管理客戶端稱為C1

 

sudo apt-get install openssh-client
ssh-keygen
如果沒有安裝openssh-client,才需要第一行命令。ssh-keygen命令會建立公鑰和私鑰檔案。將公鑰檔案複製到服務端。然後在S1上匯入到Gitosis中以後C1就無需使用者名稱和密碼便能通過SSH連線服務端了。

 

 

scp /home/chenshu/.ssh/id_rsa.pub [email protected]:/home/cncm
sudo -H -u git gitosis-init < /home/cncm/id_rsa.pub
得到下面的結果:

 

Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/

意思是S1上已經成功建立了倉庫目錄,路徑是/home/git/repositories,並且裡面還建立了一個管理員倉庫,叫gitosis-admin。

 

修改S1上一個檔案的許可權:

 

sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

 

從S1上clone出gitosis-admin倉庫到C1:

 

/home/chenshu/my_git
cd ~/my_git
git clone [email protected]:gitosis-admin.git
Cloning into gitosis-admin...
remote: Counting objects: 5, done.        
remote: Compressing objects: 100% (4/4), done.        
remote: Total 5 (delta 1), reused 5 (delta 1)        
Receiving objects: 100% (5/5), done.
Resolving deltas: 100% (1/1), done.

現在你可以通過修改gitosis-admin/gitosis.conf檔案來遠端管理S1上的倉庫:

 

[gitosis]

[group gitosis-admin]
members = [email protected]
writable = gitosis-admin

 

上面是之前gitosis初始化匯入C1的公鑰的時候自動建立的,已經將C1的使用者加入到管理員成員中

注意:也可以就在伺服器端完成本節操作,不一定非要到客戶端。

 

5.加入新使用者

現在另一臺Ubuntu客戶端C2,使用者也想加入進來使用cml專案,並管理git倉庫。

C2機器的使用者在C2上產生公鑰和私鑰檔案,並將公鑰檔案傳給C1的使用者(因為C1的使用者現在是管理員)

 

~/my_git/gitosis-admin$ mv ~/id_rsa.pub ./keydir/[email protected]
上面的命令是在C1上把C2產生的公鑰檔案id_rsa.pub複製到/home/chenshu/my_git/gitosis-admin/keydir目錄下,並改名為[email protected]

 

檔名是根據id_rsa.pub裡面的使用者名稱來的。

 

[group gitosis-admin]
members = [email protected] [email protected]
writable = gitosis-admin

 

修改gitosis.conf檔案,加入[email protected](去掉.pub字尾)到gitosis-admin組,也就是[email protected]inehome-server.com.pub成了管理員

 

在gitoosis-admin目錄下,提交設定到服務端:

 

git add .
git commit -am'add a new user'
git push

 

 

現在到C2上試一下:

 

git clone [email protected]:gitosis-admin.git

 

ok,成功獲得該目錄。



6.建立新專案

仍然編輯C1上的gitsosis.conf檔案,加入

 

[group cml]
members = [email protected] [email protected]
writable = cml


 

 

[group cml] 一節 代表新的組(專案cml),也將C1,C2的使用者加入進來.先提交一下配置檔案。

 

git add .
git commit -am'add a new project named cml'
git push

 

然後再新增真實的專案檔案。在頂層目錄,我這裡是/home/chenshu/my_git/下面建立專案目錄cml,將需要的專案檔案複製到cml中,然後執行下面的命令,將cml專案加入到S1中:

 

cd cml
git init //cml中會建立一個.git,裡面包含了git版本庫的框架
touch x
git add .
git remote add origin [email protected]:cml.git //可以在git add . 之前執行
git commit -am 'add cml project'
git push origin master:refs/heads/master

 

 

7.獲得cml專案

在C1或者C2機器上任何一個目錄下,執行

 

git clone [email protected]:cml.git

就可以獲得剛才加入到S1上的cml專案。

 

 

8.編寫指令碼自動編譯並部署時的注意

如果想在C2上編寫指令碼自動從S1上獲取最新程式碼時,要注意:

1.首先之前產生的公鑰不能設密碼,否則每次git pull的時候都會要求輸入密碼。

2.不要將專案中的編譯中間檔案提交到S1上,比如CMake工程裡面的build目錄的檔案,Maven工程裡面的target目錄裡面的檔案。否則下次在C2等客戶端用git pull會報類似於這樣的錯誤:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge.

需要執行下面的命令才能修復:

 

git reset --hard HEAD
git clean -f -d
git pull

 

9.改變預設埠

預設使用的是SSH22埠,也就是Git連線遠端伺服器的22埠。如果伺服器改變了埠號,比如443怎麼辦?

在你的當前工程根目錄下,有一個.git目錄,開啟裡面的config檔案,在[remote "origin"] 一節將url修改一下:

url = ssh://[email protected]:443/cml.git
#url = [email protected]:cml.git

如果還沒有工程,需要clone一份,用下面的命令:

git clone ssh://[email protected]:443/cml.git

 

10.Git add違反直覺的多用途

最簡單的用法,將一個未被tracked的檔案加入到Git中;

比較莫名的是,如果一個已經被tracked的檔案被修改了,必須再add一次,才能使得它的狀態變為staged,也就是在staged area中記錄下來它被修改了,否則接下來的commit操作直接忽視它;。因此在commit之前,用git status來確認所有修改的檔案都已經在staged area中很有必要。真的繁瑣,其實有時候需要一個快捷命令一次搞定,可以在commit的時候加上-a引數即可。將會自動在commit之前執行add命令。

居然還可以用add標記檔案衝突已經解決。

11.Agent admitted failure to sign using the key

遇到一個很奇怪的問題,新增一個使用者的時候一切步驟都是正確的,就是一直要求輸入密碼。當然有個報錯資訊:

Agent admitted failure to sign using the key

原來需要在客戶端匯入私鑰,用下面的命令:

ssh-add ~/.ssh/id_rsa

 

原因不明,現在對SSH認證機制的原理還不夠清楚,以後慢慢弄明白吧。

 

12.直接從本地倉庫中clone

在Ubuntu下,按照以上的操作完成伺服器搭建後,預設git檔案會存放在/home/git/repositories目錄下。用下面的命令直接clone即可。

git clone /home/git/repositories/cml.git

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed