linux 安裝 git server


一 安裝

 版本控制系統經歷 CVS , SVN, 現在到了 Git 的世界。 Git 與 CVS, SVN 相比有很多的優勢,其中最為人津津樂道的就是 branch 的切換都是在本地執行,速度非常之快,非常利於分布式開發進程。現在也是開源世界了最流行的版本控制系統。比如:Fedora 社區(http://git.fedorahosted.org/git), JBoss AS 7 的 source(https://github.com/jbossas/jboss-as) 等。

 

      GitHub 提供免費的 Git server, 但是它僅僅針對 Public 的 repository 是免費的,如果你想有你個人的 Git repsotories, 就需要交費了。 但是, 依照國人一向不信他人,只信自己的美德, 應該很少有人把機密的代碼交由外人掌管吧,萬一 GitHub 被黑了, 那豈不是一起遭殃? 怎么辦呢, 自己建立個 Server 不就完了嗎。

 

第一步: 安裝 Git

 

NOTE:
接下來的操作都是在 Server 機器上運行

 

      Fedora 下運行:

Shell代碼   收藏代碼
  1. yum install git-core  

 

      Ubuntu 下運行:

Shell代碼   收藏代碼
  1. apt-get install git-core  

 

 

第二步: 初始化一個 repository

 

Shell代碼   收藏代碼
  1. [lgao@lgao myclone]$ cd /home/lgao/sources/my_own/repositories/  
  2. [lgao@lgao repositories]$ git init --bare myprj  
  3. Initialized empty Git repository in /home/lgao/sources/my_own/repositories/myprj/.git/  

 

    指定 --bare,當前 repository 下就只有 .git/ 下的 objects,而沒有真實文件。一般在 Server 端。

 

第三步: 初始化提交

 

    當一個 repository 初始化后, 里面什么也沒有。我們需要建立個 master branch,才能被正常 clone 到其他地方。

Shell代碼   收藏代碼
  1. [lgao@lgao myclient]$ mkdir initial.commit  
  2. [lgao@lgao myclient]$ cd initial.commit/  
  3. [lgao@lgao initial.commit]$ git init  
  4. Initialized empty Git repository in /home/lgao/sources/my_own/myclient/initial.commit/.git/  
  5. [lgao@lgao initial.commit]$ git remote add origin /home/lgao/sources/my_own/repositories/myprj/  
  6. [lgao@lgao initial.commit]$ touch Readme  
  7. [lgao@lgao initial.commit]$ git add Readme  
  8. [lgao@lgao initial.commit]$ git commit -m "initial commit"  
  9. [master (root-commit) 032dad8] initial commit  
  10.  0 files changed, 0 insertions(+), 0 deletions(-)  
  11.  create mode 100644 Readme  
  12. [lgao@lgao initial.commit]$ git push origin master  
  13. Counting objects: 3, done.  
  14. Writing objects: 100% (3/3), 206 bytes, done.  
  15. Total 3 (delta 0), reused 0 (delta 0)  
  16. Unpacking objects: 100% (3/3), done.  
  17. To /home/lgao/sources/my_own/repositories/myprj/  
  18.  * [new branch]      master -> master  

 第四步  正常使用

 

      經過初始化提交過程,相當於激活了該 repository, 我們可以正常使用了。

Shell代碼   收藏代碼
  1. [lgao@lgao myclient]$ git clone /home/lgao/sources/my_own/repositories/myprj/   
  2. Cloning into 'myprj'...  
  3. done.  
  4. [lgao@lgao myclient]$ cd myprj  
  5. [lgao@lgao myprj]$ l  
  6. total 0  
  7. -rw-rw-r-- 1 lgao lgao 0 Jan 21 15:15 Readme  
  8. [lgao@lgao myprj]$ vim Readme   
  9. [lgao@lgao myprj]$ git commit -m "modify readme" Readme  
  10. [master 1bf69b4] modify readme  
  11.  1 files changed, 1 insertions(+), 0 deletions(-)  
  12. [lgao@lgao myprj]$ git push  
  13. Counting objects: 5, done.  
  14. Writing objects: 100% (3/3), 247 bytes, done.  
  15. Total 3 (delta 0), reused 0 (delta 0)  
  16. Unpacking objects: 100% (3/3), done.  
  17. To /home/lgao/sources/my_own/repositories/myprj/  
  18.    032dad8..1bf69b4  master -> master  

 

 

 第五步   與他人共享 Repository

 

       按照上面的步驟,我們已經可以使用 Git 了。 但是 Git repository 的 URL 都是本地目錄, 怎么能方便的讓合作伙伴方便的訪問該 Repository 呢? 這就要介紹下 Git 支持的 4 中傳輸協議了: Local, SSH, Git, HTTP。 我們一個個的介紹:

Local

  Local 就是指本地文件系統,可以是本機器文件,也可以是通過 NFS 加載的網絡映射。這種情形下與人共享就是把你的 repository 所在的目錄作為 NFS 共享出去,讓能訪問到你機器的人像本地文件一樣操作。具體怎么 NFS 共享超出本文范圍,不加討論(有興趣的請參考: http://docs.fedoraproject.org/en-US/Fedora/14/html/Storage_Administration_Guide/ch-nfs.html )。不過不推薦這種方式共享, 因為效率太低。

SSH

   SSH 協議大家都很熟悉,只要你的 Server 能 ssh 登錄就可以。假設你的 Server 可以遠程 ssh 登錄,我們看如何從 Server clone 出 Git Repository:

Shell代碼   收藏代碼
  1. [lgao@lgao myclient]$ git clone lgao@10.66.14.143:git_repos/myprj from_remote  
  2. Cloning into 'from_remote'...  
  3. lgao@10.66.14.143's password:   
  4. remote: Counting objects: 3, done.  
  5. remote: Total 3 (delta 0), reused 0 (delta 0)  
  6. Receiving objects: 100% (3/3), done.  
  也就是說只要你在 Server 端給一個用戶創建完帳號后, 他就可以 clone 代碼了。 具體的權限設置和 Linux 下權限配置是一樣的。 一般跟一組 repositories 指定一個新的 group, 把新建的用戶加入到該 group 后就可以有相應的讀寫權限了。
   還有另外一種方式,是通過提交公鑰到 Server 端來獲得訪問和提交權限,而不需要創建用戶。 具體細節本文不加討論。
Git

   該協議一般只是只讀權限。

 

   第一步需要安裝 git-daemon:

Shell代碼   收藏代碼
  1. [root@lgao ~]# yum install git-daemon  

 

   接着啟動 git-daemon:

Shell代碼   收藏代碼
  1. [lgao@lgao initial.commit]$ git daemon --base-path=/home/lgao/sources/my_own/repositories --export-all  

 

    在你的工程下創建 git-daemon-export-ok 文件:

Shell代碼   收藏代碼
  1. [lgao@lgao repositories]$ cd myprj  
  2. [lgao@lgao myprj]$ touch git-daemon-export-ok  

 

     現在就可以通過 Git 協議 clone repository 了:

Shell代碼   收藏代碼
  1. [lgao@lgao test]$ git clone git://lgao.nay.redhat.com/myprj  
  2. Cloning into 'myprj'...  
  3. remote: Counting objects: 6, done.  
  4. remote: Compressing objects: 100% (2/2), done.  
  5. remote: Total 6 (delta 0), reused 0 (delta 0)  
  6. Receiving objects: 100% (6/6), done.  
HTTP

   該協議一般只是只讀權限。GitWeb 包提供 CGI , 它可以被部署到任何支持靜態 web 服務的服務器中去。我們還以最常見的 Apache 為例:

 

    版本信息:

Shell代碼   收藏代碼
  1. Httpd:Apache/2.2.21 (Fedora)   
  2. Git:  git version 1.7.7.5  
  3. GitWeb:1.7.7.5-1.fc16  

 

    安裝 Httpd 和 gitweb:

Shell代碼   收藏代碼
  1. [lgao@lgao initial.commit]$ sudo yum install httpd gitweb  

 

    修改 /etc/gitweb.conf:

Shell代碼   收藏代碼
  1. [lgao@lgao repositories]$ vim /etc/gitweb.conf  
  2. 修改:  
  3. our $projectroot = "/home/lgao/sources/my_own/repositories";   

 

    在 httpd 的 DocumentRoot 所在目錄創建 Link 文件:

Shell代碼   收藏代碼
  1. [root@lgao DCIM]# cd /var/www/html  
  2. [root@lgao html]# ln -s /home/lgao/sources/my_own/repositories/ git  
  3. [root@lgao html]# chown -R lgao.lgao git  

 

    修改 httpd.conf 中的 user 和 group:

Java代碼   收藏代碼
  1. User lgao  
  2. Group lgao  

 

   重啟 httpd:

Shell代碼   收藏代碼
  1. [root@lgao httpd]# service httpd restart  
  2. Restarting httpd (via systemctl):                          [  OK  ]  

 

    OK 了, 現在就可以訪問了:

 

    你可以修改 Server 機器下 <Your Repo>/description ,這樣可以顯示在 git web 頁面上。

 

    修改 <Your Repo>/config , 加上 owner 和 url:

 

 

Shell代碼   收藏代碼
  1. [gitweb]  
  2.         owner = Your Name <name@example.com>  
  3.         url = git://lgao.nay.redhat.com/myprj  

 

 

之后,我們再看看截圖:

  

 

 

二 git常用命令

git clone: 這是較為簡單的一種初始化方式,當你已經有一個遠程的Git版本庫,只需要在本地克隆一份,例如'git clone git://github.com/someone/some_project.git some_project'命令就是將'git://github.com/someone/some_project.git'這個URL地址的遠程版 本庫完全克隆到本地some_project目錄下面

git init和git remote:這種方式稍微復雜一些,當你本地創建了一個工作目錄,你可以進入這個目錄,使用'git init'命令進行初始化,Git以后就會對該目錄下的文件進行版本控制,這時候如果你需要將它放到遠程服務器上,可以在遠程服務器上創建一個目錄,並把 可訪問的URL記錄下來,此時你就可以利用'git remote add'命令來增加一個遠程服務器端,例如'git remote add origin git://github.com/someone/another_project.git'這條命令就會增加URL地址為'git: //github.com/someone/another_project.git',名稱為origin的遠程服務器,以后提交代碼的時候只需要使用 originalias.html' target='_blank'>別名即可

現在我們有了本地和遠程的版本庫,讓我們來試着用用Git的基本命令吧:

git pull:從其他的版本庫(既可以是遠程的也可以是本地的)將代碼更新到本地,例如:'git pull origin master'就是將origin這個版本庫的代碼更新到本地的master主枝,該功能類似於SVN的update

git add:是將當前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執行的一步,例如'git add app/model/user.rb'就會增加app/model/user.rb文件到Git的索引中

git rm:從當前的工作空間中和索引中刪除文件,例如'git rm app/model/user.rb'

git commit:提交當前工作空間的修改內容,類似於SVN的commit命令,例如'git commit -m story #3, add user model',提交的時候必須用-m來輸入一條提交信息

git push:將本地commit的代碼更新到遠程版本庫中,例如'git push origin'就會將本地的代碼更新到名為orgin的遠程版本庫中

git log:查看歷史日志

git revert:還原一個版本的修改,必須提供一個具體的Git版本號,例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20',Git的版本號都是生成的一個哈希值

上面的命令幾乎都是每個版本控制工具所公有的,下面就開始嘗試一下Git獨有的一些命令:

git branch:對分支的增、刪、查等操作,例如'git branch new_branch'會從當前的工作版本創建一個叫做new_branch的新分支,'git branch -D new_branch'就會強制刪除叫做new_branch的分支,'git branch'就會列出本地所有的分支

git checkout:Git的checkout有兩個作用,其一是在不同的branch之間進行切換,例如'git checkout new_branch'就會切換到new_branch的分支上去;另一個功能是還原代碼的作用,例如'git checkout app/model/user.rb'就會將user.rb文件從上一個已提交的版本中更新回來,未提交的內容全部會回滾

git rebase:用下面兩幅圖解釋會比較清楚一些,rebase命令執行后,實際上是將分支點從C移到了G,這樣分支也就具有了從C到G的功能

git stash:將當前未提交的工作存入Git工作棧中,時機成熟的時候再應用回來,這里暫時提一下這個命令的用法,后面在技巧篇會重點講解

git config:利用這個命令可以新增、更改Git的各種設置,例如'git config branch.master.remote origin'就將master的遠程版本庫設置為別名叫做origin版本庫,后面在技巧篇會利用這個命令個性化設置你的Git,為你打造獨一無二的 Git

git tag:可以將某個具體的版本打上一個標簽,這樣你就不需要記憶復雜的版本號哈希值了,例如你可以使用'git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20'來標記這個被你還原的版本,那么以后你想查看該版本時,就可以使用 revert_version標簽名,而不是哈希值了

使用Gitolite來對Git的repository實現權限控制

我們項目組打算從svn向git遷移,前幾天我搭建了git環境,把代碼從svn轉移過來,然后所有成員都通過server上的git賬號來做pull和push,一切都安置妥當,沒有問題。但是后來其它項目組也打算使用這個git server,那么問題來了,之前那種授權的方式肯定是不夠的,因為只要能連上server,那么他對這個server上所有的repository都有完全的讀寫權限,這顯然是不可接受的。

所以打算使用Gitolite這個組件來做權限控制,搜索了下,找到的文章貌似都是老版本的,所以有了寫這篇文章的想法。

Gitolite其實也是一個git repository,首先在server上安裝好后,在client上把server上的repository clone下來,在本地做一些更改,再push回server,server端的hooks會根據push上來的配置來更新權限。

接下來,介紹下安裝和配置步驟

准備工作

如果你之前是用git賬號來做權限控制的話,記得把/etc/passwd里git用戶的shell換回/bin/bash,然后把~git/.ssh/authorized_key里不再需要的key移除。

ssh-kengen生成一對key,比如your-name和your-name.pub(下文均以此為例)

拷貝私鑰到本用戶的.ssh文件夾中

mv your-name ~/.ssh/

拷貝公鑰到git server上

scp you-name.pub git@your.server.name.or.ip.address:~

為了以后方便,這里可以做一個server別名,指定連接所需的用戶名,server的地址、端口以及私鑰

vim ~/.ssh/config

輸入以下內容

host githost
user your-name
hostname your.server.name.or.ip.address
port 22
identityfile ~/.ssh/your-name

安裝Gitolite

登錄git server

ssh git@your.server.name.or.ip.address

下載最新的Gitolite

git clone git://github.com/sitaramc/gitolite

安裝,這里說明下,安裝方式有3種,區別在與指定生成gitolite可執行文件的路徑,這里采用Gitolite作者推薦的第二種,也就是把文件生成到$HOME/bin中,這樣可以在接下來的bash中直接執行gitolite命令而不用指定路徑(如果你的~/bin目錄不存在記得先mkdir ~/bin)

gitolite/install -ln

設置,由於是第一次運行這個命令,所以這里指定的key是擁有Gitolite管理員權限的

gitolite setup -pk your-name.pub

此命令會在你的~/repositories/目錄生成兩個repository:gitolite-admin.git和testing.git

配置權限

退到你的workstation上

exit

clone剛才生成的gitolite-admin.git

git clone githost:gitolite-admin

注意這里用的是剛才准備好的server別名來連接的,其中最重要的區別是使用your-name.pub這個key,並且沒有采用絕對路徑來指定想要clone的repository,而是直接使用名稱,並且這個名稱也沒有包括.git這個后綴。這一點很重要,因為這是用Gitolite的機制來clone,如果你跳過它直接使用git來,那么它的一些功能就無法實現了。以后clone, push其它需要受Gitolite權限控制的repository都必須這樣做。

clone完后會有個新的目錄gitolite-admin,里面有兩個文件夾confkeydir,第一個目錄中包含的是配置文件,里面就是記錄權限配置的地方,第二個目錄中則包含所有用戶的pub key。

現在我們打開配置文件,按照我們的權限配置需要進行設置

vim gitolite-admin/conf/gitolite.conf

我期望的配置如下,你也可以根據你的需要做更改

@repos_a @proj1 @proj2
@repos_b @proj3 @proj4 @proj5

@team_a @user1 @user2
@team_b @user3 @user4

repo gitolite-admin
RW+ = your-name

repo @repos_a
RW+ = @team_a
R = @all

repo @repos_b
RW+ = @team_b

這個配置很簡單,首先定義了兩個repository group,再又定義了兩個user group,group的好處就是以后添加repository和user的時候,不需要再單獨配置,只需加入到對應的group中即可。

  • 添加全新的repository,在上面提到的gitolite.conf文件中配置好對應的名稱和權限,再push到server即可,server會自動幫你創建一個empty的bare repository。
  • 如果你已經有一個repository,想把它加進來的話,那就把它拷貝到git server上的~/repositories文件夾里,記得文件夾名要以.git結尾,並且這個repository一定要是bare的,(你可以通過拷貝repository里的.git文件夾,然后運行git config --bool core.bare true,也可以運行git clone --bare your-repository來得到bare repository)。這種方式還有一個額外的操作就是在server上運行一次gitolite setup
  • 移除repository,在配置文件中移除對應的repo,然后push,接着再刪除server上對應的文件夾即可。
  • 添加user,把pub key拷貝到keydir文件夾里
  • 刪除user,一樣,移除keydir里對應的pub key

注意,上面說的操作,都必須在clone的gitolite-admin里做更改,然后push,千萬別在server上自己來,那樣是沒用的,因為這些權限配置、repository管理都有一些額外的操作,gitolite-admin會幫你搞定一切。

把你的更改push回server上,試試clone,pull,push,看看權限是否正確。比如

git clone githost:proj3

更多的內容,可以參考官方文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM