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