Git服務器、http協議及XCode


  本來費了老鼻子牛勁搭好了SVN,可以通過web進行訪問,也弄好了eclipse和XCode,結果幾個開發的同事說要上git,悲了個催,又開始折騰git。

  因為公司只有一個公網的http出口,因此開始了web上的git之路。目標是通過web在公司內部的git服務器上進行代碼管理,必須實現簡單的權限設置(指定的人才能讀寫)。因為一開始就奔web去,結果半桶水盪啊盪的,發現怎么都搞不定。因此悟出了個道理,研究一個東西,不管目標是什么,一定得從頭開始,而且必須一個一個動手試,這樣才能理解基礎知識,否則過程中很多東西會因為一知半解而失敗。到現在,終於完成了git服務器、ssh協議、http協議進行clone、push和pull,以及xcode集成的git可以push。

  思路:需要安裝的組件:git、gitosis(實現git的基本權限)、git-core、gitweb。涉及的機器有客戶機(開發用)和服務器。無論是客戶端還是服務器都必須安裝git(xcode內置了git)。服務器要作為git倉庫無需工作區、暫存區,通過--bare參數建立裸倉庫。git服務可以通過多種協議向客戶端提供服務(本地傳輸,SSH 協議,Git 協議和 HTTP 協議,可以參看《服務器上的 Git - 協議》),開始一上來就試web,結果走了很多彎路,安裝gitweb可以參見《在Ubuntu 14.04上配置 gitweb》,但折騰了半天總是出現不知道命令中的地址怎么填,或權限怎么配的問題,因此靜下心來從基礎做起,先做ssh,再實現http。

  首先是安裝配置git和gitosis,實現在命令行和XCode中通過ssh協議從服務端clone、pull以及push。此間參考下面的資料1~4。

  然后是安裝gitweb和git-core,實現在命令行通過http協議clone項目,XCode中通過http協議從服務器push。

  關於參考資料:

  1、《搭建ubuntu上的git服務器,並用Mac下用Xcode連接進行開發》:這個詳細講述了gitosis的安裝及簡單配置,按照它實施至少可以實現用客戶端管理服務器的gitosis及裸倉庫,並可以實現手工進行clone、pull、push。其中涉及到ssh生成rsa密碼文件以及在ssh協議中的使用。將在服務器的git/.ssh目錄下生成authorized_keys文件,一行一個用戶,這些用戶都是ssh客戶端,可以用來免密碼。

  2、《服務器 Gitosis 架設指南》:這里涉及了gitosis的配置,比上文要詳細。注意git remote add origin git@192.168.1.115:foo.git命令,在后面XCode中要用到。

  3、《gitosis安裝配置詳細過程》:這個對gitosis的配置解釋也比較好。

  需要記錄的是在gitosis中走過的彎路有:客戶端生成的rsa文件自動用user@machinename.local為名字建立rsa文件(這個名字在id_rsa.pub文件中末尾),在初始化gitosis的時候並不能更改這個名字,即使按照上文中寫的改rsa.pub文件名來初始化也一樣的會以帶@符號的名字出現在gitosis中。當時為了改掉這個@符號,我復制了一個pub文件,改名后在客戶端添加到keydir中,再commit和push到服務器,結果吧gitosis弄壞了,原因是兩個內容相同但名字不同的文件導致gitosis沒法鑒權。用戶名后來是直接改上述的authorized_keys文件中的靠前的那個名字來實現。

  4、《理解 XCode 中的 Git 版本控制》:這個詳細講述了XCode中的Git,兩種本地git庫的建立方式,一個是新建項目時自動建,一個是已有項目用命令行方式建。這還只是本地git倉庫的實現。

  需要記錄的是XCode中遠程倉庫的添加,6.1版本的repository在preferences中,整了幾次都失敗了,估計是使用了錯誤的用戶名或連接方式,最終成功的方法是用命令行:git remote add test@server git@serverip:test.git,其中test@server是取的名字,以后在push或pull中可以直接引用。

  5、《git-http-backend - Server side implementation of Git over HTTP》:這個描述了如何配置apache來實現http協議的clone和push。我理解的是要用git-http-backend來支持push,一般網上裝的gitweb都只提供瀏覽。

  需要記錄的是:

  • 其中有三行配置,需要修改/etc/apache2/conf-available/gitweb.conf,下面是我的gitweb.conf,其中行1與行2互斥。保留第一行則使用了gitweb,在瀏覽器http://server/mygit/路徑中可以瀏覽所有項目,但無法clone、push,保留第二行則使用了git-http-backend,而gitweb失效,在瀏覽器http://server/mygit/中看到的是空白,但可以clone、push。還有行2的路徑是lib,而不是原文中的libexec,得自己找,估計跟操作系統有關。
  • 另外需要記錄的是權限。配置了dav_git.passwd文件並啟用之后才能clone,如果不配置權限(注釋掉行15、16),clone時報“The requested URL returned error: 403”錯誤。
  • 通過htpasswd命令新增http協議用戶,如:htpasswd dav_git.passwd xx增加xx用戶。此處是htpasswd命令詳解
  • 服務器上項目的文件權限必須配置成777,否則push時會報insufficient permission for adding an object to repository database。
 1 #Alias /mygit /usr/share/gitweb
 2 ScriptAlias /mygit/ /usr/lib/git-core/git-http-backend/
 3 SetEnv GIT_HTTP_EXPORT_ALL
 4 SetEnv GIT_PROJECT_ROOT /var/www/html/repositories
 5 
 6 <Directory /usr/share/gitweb>
 7   Options +FollowSymLinks +ExecCGI +SymLinksIfOwnerMatch
 8   AddHandler cgi-script .cgi
 9 </Directory>
10 
11 <Location /mygit/>
12      DAV on
13      AuthType Basic
14      AuthName "My Git"
15      AuthUserFile /etc/apache2/dav_git.passwd
16      Require valid-user
17 </Location>

  最后,XCode中遠程repositories的地址:http協議:http://server/mygit/test.git。ssh協議:http://ServerIP/mygit/test.git。至於權限,ssh需要填git用戶及其密碼(server上的git用戶在/etc/passwd文件中要/bin/bash,不能/bin/false),http制作passwd文件時的用戶名及密碼。可能需要在終端窗口中、項目目錄下執行git remote add test http://ServerIP/mygit/test.git來為遠程服務器命名,后續在xcode中才能進行push。

ps:git clone http://server/mygit/test.git來將服務器的source拉到本地。

 


免責聲明!

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



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