4種git支援的協議中,ssh 配置簡單,許可權管理也比較全面,無需密碼,且linux 內建,當然會有偏向平臺的。git協議是執行最快的,基本上和作業系統關係不大,就是git-daemon 啟動,然後git-clone。對那些人來說,快是很重要的。
至於 smart http 很慢,並且,配置真的(相對)複雜,需要了解cgi的概念,環境變數概念,特定的web server的配置方法,以及特定作業系統的配置方法。我看到的pro git中的smart http配置,就是缺少一些步驟的。
我剛剛寫了文章,對比了下,ssh,git配置大概半頁,http3頁而且只能適應於osx,apache的組合。可以欣賞下:
==========正文
## 更多協議
想要和他人協作,我必須有遠端倉庫,這樣我才可以推送和拉取程式碼的變更。在上一節,我們已經透過一個共享倉庫作為中介,以本地協議的通訊方式,達成兩人(多人)的程式碼協作了。
git支援4種協議,包括本地協議、HTTP協議、Git協議、SSH協議。我們繼續看看Git協議。
## Git 協議
透過Git協議來託管倉庫是內置於git-daemon命令之內。因此使用它來做測試和驗證倉庫的託管是非常方便的。執行 git-daemon,會啟動一個監守程式,等待採用git協議來連線的客戶端,這些連線過來的客戶端可以訪問指定目錄下的倉庫。
假設我們在~/git目錄內已經存在一個共享倉庫,那麼
cd ~/git
git daemon --verbose --export-all --base-path=. --enable=receive-pack
這裡的新命令git-daemon需要做些解釋。引數說明:
--base-path=. 指定基礎目錄,客戶端連線指定的目錄都相對於此目錄來定位目錄。當前命令列內的基礎目錄就是 ~/git
--enable=receive-
--export-all 公開全部倉庫
啟動了git監守程式,就可以在客戶端執行git-clone來拉取倉庫了:
git clone git://localhost/repo.git
我們使用的主機地址為localhost,就是意味著拉取的倉庫位於本機;你可以使用IP地址,就可以訪問其他主機的託管倉庫了。
## SSH 協議
以 OS X 為例,首先啟用sshd:
sudo systemsetup -setremotelogin on
隨後遠端登入到主機(為了演示和測試的方便,遠端主機使用localhost來做模擬),並輸入密碼:
ssh localhhost
然後建立一個共享倉庫:
mkdir gitshared.git
cd gitshared.git
git init --bare --shared
exit
這時我們已經準備好了一個空倉庫,可以在另外一個主機(也是本機)做克隆了。
git clone ssh://localhost/Users/lcjun/gitshared.git
使用git-remote來查詢遠端倉庫:
$git remote -v
origin ssh://localhost/Users/lcjun/gitshared (fetch)
origin ssh://localhost/Users/lcjun/gitshared (push)
即可驗證命令確實有效的被執行了,ssh遠端倉庫也已經和本地關聯起來了。
## HTTP
HTTP 協議下的git託管是相對最複雜的,因為它涉及到了Web Server的配置,CGI知識,特定的OS。WebServer和作業系統的版本差異也會對應有不同的配置方法。我的作業系統是OS X EI Captain,Git 版本為2.6,Apache 版本為2.4 。我以本機為伺服器,本機地址為192.168.3.11 。在這樣的環境下,我希望可以使用
git clone http://git.example.com/repo.git
的形式,以http協議方法訪問主機上的repo.git 倉庫。留意URL的第一部分是http,而不是ssh,或者git。
假設倉庫以 /var/www/git 存放。我在此目錄內建立一個名為 repo.git 的倉庫:
mkdir -p /var/www/git/repo.git
cd /var/www/git/repo.git
在本機內,找到 hosts 檔案,並加入如下一行,以便支援透過主機名(http://git.example.com)訪問主機
192.168.3.11 http://git.example.com
我採用apache作為Web 伺服器,首先保證apache是啟動和可以訪問的:
$ sudo apachectl start
$ curl localhost
<html><body><h1>It works!</h1></body></html>
¥ curl http://git.example.com
git-http-backend 需要引用模組 cgi,env,alias。必須它們是被載入了的。具體的做法是檢視 http.conf ,確保一下模樣的行是沒有被標註的。如果被標註(行首有一個#),那麼透過去掉“#”來解除標註。我的主機上,http.conf的位置在 /etc/apache2/httpd.conf 。
LoadModule cgi_module libexec/apache2/mod_cgi.so
LoadModule env_module libexec/apache2/mod_env.so
LoadModule alias_module libexec/apache2/mod_alias.so
找到http.conf ,加入如下配置在檔案末尾,它添加了一個名為http://git.example.com的虛擬主機,它的文件目錄為/var/www/git:
<VirtualHost 192.168.3.11:80>
DocumentRoot /var/www/git
ServerName http://git.example.com
<Directory "/var/www/git">
Options +Indexes
Require all granted
</Directory>
<Directory "/usr/local/Cellar/git/2.4.1/libexec/git-core/">
Options ExecCGI Indexes
Order allow,deny
Allow from all
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv GIT_PROJECT_ROOT /var/www/git
ScriptAlias /git/ /usr/local/Cellar/git/2.4.1/libexec/git-core/git-http-backend/
</VirtualHost>
同時,這段配置內還添加了一個指令碼別名,別名指向git-http-backend的CGI程式。git-http-backend 在不同的系統上可能位置不同,可以使用這個命令查詢到它:
$ find / -name git-http-backend 2>/dev/null
為了讓此CGI 可以執行,也必須配套的把CGI所在目錄設定為允許執行CGI(Options ExecCGI)。
GIT_PROJECT_ROOT 必須設定,這個值是 git-http-backend 需要的,有了它,git-http-backend 就知道如何定位基礎目錄了。環境變數 GIT_HTTP_EXPORT_ALL 看起來有點熟悉,是因為我們在上一節git 協議內在git守護程序的命令列中看到過它。設定了此環境變數,就意味著在基礎目錄內的所有倉庫都是可以對外共享的。
進入需要克隆的git倉庫所在的目錄並執行git update-server-info:
sudo git update-server-info
重啟apache
sudo apachectl restart
隨後,我就可以真的去克隆一個在apache服務後的git倉庫了:
Cloning into "repo"...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
這個配置過程相對複雜,難免配置是出現不期望的錯誤,那麼常備些命令是可以幫助除錯的。比如檢視Apache 執行錯誤
sudo tail /private/var/log/apache2/error_log
我需要多次修改http.conf ,記得使用:
apachectl configtest
驗證下配置是正確的。我發現這個命令對我是有用的。
#找到apache 使用者的方法
$ ps aux | egrep "(apache|httpd)".
#找到apache使用者組的方法:
$ id user-name
user-name 換成apache 使用者名稱
在我的主機上,我在升級git的時候,曾經出過這樣的報錯:
$brew upgrade git
# Git package broken in 10.11 El Capitan
brew reinstall git
...
==> make prefix=/usr/local/Cellar/git/2.4.3 sysconfdir=/usr/local/etc CC=clang C
./git-compat-util.h:219:10: fatal error: "openssl/ssl.h" file not found
#include <openssl/ssl.h>
^
我嘗試了改變下命令列引數的方式:
brew reinstall git --with-brewed-openssl
結果是可以升級到最新的git版本的(git 2.6.4)
4種git支援的協議中,ssh 配置簡單,許可權管理也比較全面,無需密碼,且linux 內建,當然會有偏向平臺的。git協議是執行最快的,基本上和作業系統關係不大,就是git-daemon 啟動,然後git-clone。對那些人來說,快是很重要的。
至於 smart http 很慢,並且,配置真的(相對)複雜,需要了解cgi的概念,環境變數概念,特定的web server的配置方法,以及特定作業系統的配置方法。我看到的pro git中的smart http配置,就是缺少一些步驟的。
我剛剛寫了文章,對比了下,ssh,git配置大概半頁,http3頁而且只能適應於osx,apache的組合。可以欣賞下:
==========正文
## 更多協議
想要和他人協作,我必須有遠端倉庫,這樣我才可以推送和拉取程式碼的變更。在上一節,我們已經透過一個共享倉庫作為中介,以本地協議的通訊方式,達成兩人(多人)的程式碼協作了。
git支援4種協議,包括本地協議、HTTP協議、Git協議、SSH協議。我們繼續看看Git協議。
## Git 協議
透過Git協議來託管倉庫是內置於git-daemon命令之內。因此使用它來做測試和驗證倉庫的託管是非常方便的。執行 git-daemon,會啟動一個監守程式,等待採用git協議來連線的客戶端,這些連線過來的客戶端可以訪問指定目錄下的倉庫。
假設我們在~/git目錄內已經存在一個共享倉庫,那麼
cd ~/git
git daemon --verbose --export-all --base-path=. --enable=receive-pack
這裡的新命令git-daemon需要做些解釋。引數說明:
--base-path=. 指定基礎目錄,客戶端連線指定的目錄都相對於此目錄來定位目錄。當前命令列內的基礎目錄就是 ~/git
--enable=receive-
--export-all 公開全部倉庫
啟動了git監守程式,就可以在客戶端執行git-clone來拉取倉庫了:
git clone git://localhost/repo.git
我們使用的主機地址為localhost,就是意味著拉取的倉庫位於本機;你可以使用IP地址,就可以訪問其他主機的託管倉庫了。
## SSH 協議
以 OS X 為例,首先啟用sshd:
sudo systemsetup -setremotelogin on
隨後遠端登入到主機(為了演示和測試的方便,遠端主機使用localhost來做模擬),並輸入密碼:
ssh localhhost
然後建立一個共享倉庫:
mkdir gitshared.git
cd gitshared.git
git init --bare --shared
exit
這時我們已經準備好了一個空倉庫,可以在另外一個主機(也是本機)做克隆了。
git clone ssh://localhost/Users/lcjun/gitshared.git
使用git-remote來查詢遠端倉庫:
$git remote -v
origin ssh://localhost/Users/lcjun/gitshared (fetch)
origin ssh://localhost/Users/lcjun/gitshared (push)
即可驗證命令確實有效的被執行了,ssh遠端倉庫也已經和本地關聯起來了。
## HTTP
HTTP 協議下的git託管是相對最複雜的,因為它涉及到了Web Server的配置,CGI知識,特定的OS。WebServer和作業系統的版本差異也會對應有不同的配置方法。我的作業系統是OS X EI Captain,Git 版本為2.6,Apache 版本為2.4 。我以本機為伺服器,本機地址為192.168.3.11 。在這樣的環境下,我希望可以使用
git clone http://git.example.com/repo.git
的形式,以http協議方法訪問主機上的repo.git 倉庫。留意URL的第一部分是http,而不是ssh,或者git。
假設倉庫以 /var/www/git 存放。我在此目錄內建立一個名為 repo.git 的倉庫:
mkdir -p /var/www/git/repo.git
cd /var/www/git/repo.git
git init --bare --shared
在本機內,找到 hosts 檔案,並加入如下一行,以便支援透過主機名(http://git.example.com)訪問主機
192.168.3.11 http://git.example.com
我採用apache作為Web 伺服器,首先保證apache是啟動和可以訪問的:
$ sudo apachectl start
$ curl localhost
<html><body><h1>It works!</h1></body></html>
¥ curl http://git.example.com
<html><body><h1>It works!</h1></body></html>
git-http-backend 需要引用模組 cgi,env,alias。必須它們是被載入了的。具體的做法是檢視 http.conf ,確保一下模樣的行是沒有被標註的。如果被標註(行首有一個#),那麼透過去掉“#”來解除標註。我的主機上,http.conf的位置在 /etc/apache2/httpd.conf 。
LoadModule cgi_module libexec/apache2/mod_cgi.so
LoadModule env_module libexec/apache2/mod_env.so
LoadModule alias_module libexec/apache2/mod_alias.so
找到http.conf ,加入如下配置在檔案末尾,它添加了一個名為http://git.example.com的虛擬主機,它的文件目錄為/var/www/git:
<VirtualHost 192.168.3.11:80>
DocumentRoot /var/www/git
ServerName http://git.example.com
<Directory "/var/www/git">
Options +Indexes
Require all granted
</Directory>
<Directory "/usr/local/Cellar/git/2.4.1/libexec/git-core/">
Options ExecCGI Indexes
Order allow,deny
Allow from all
Require all granted
</Directory>
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv GIT_PROJECT_ROOT /var/www/git
ScriptAlias /git/ /usr/local/Cellar/git/2.4.1/libexec/git-core/git-http-backend/
</VirtualHost>
同時,這段配置內還添加了一個指令碼別名,別名指向git-http-backend的CGI程式。git-http-backend 在不同的系統上可能位置不同,可以使用這個命令查詢到它:
$ find / -name git-http-backend 2>/dev/null
為了讓此CGI 可以執行,也必須配套的把CGI所在目錄設定為允許執行CGI(Options ExecCGI)。
GIT_PROJECT_ROOT 必須設定,這個值是 git-http-backend 需要的,有了它,git-http-backend 就知道如何定位基礎目錄了。環境變數 GIT_HTTP_EXPORT_ALL 看起來有點熟悉,是因為我們在上一節git 協議內在git守護程序的命令列中看到過它。設定了此環境變數,就意味著在基礎目錄內的所有倉庫都是可以對外共享的。
進入需要克隆的git倉庫所在的目錄並執行git update-server-info:
cd /var/www/git/repo.git
sudo git update-server-info
重啟apache
sudo apachectl restart
隨後,我就可以真的去克隆一個在apache服務後的git倉庫了:
git clone http://git.example.com/repo.git
Cloning into "repo"...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
這個配置過程相對複雜,難免配置是出現不期望的錯誤,那麼常備些命令是可以幫助除錯的。比如檢視Apache 執行錯誤
sudo tail /private/var/log/apache2/error_log
我需要多次修改http.conf ,記得使用:
apachectl configtest
驗證下配置是正確的。我發現這個命令對我是有用的。
#找到apache 使用者的方法
$ ps aux | egrep "(apache|httpd)".
#找到apache使用者組的方法:
$ id user-name
user-name 換成apache 使用者名稱
在我的主機上,我在升級git的時候,曾經出過這樣的報錯:
$brew upgrade git
# Git package broken in 10.11 El Capitan
brew reinstall git
...
==> make prefix=/usr/local/Cellar/git/2.4.3 sysconfdir=/usr/local/etc CC=clang C
./git-compat-util.h:219:10: fatal error: "openssl/ssl.h" file not found
#include <openssl/ssl.h>
^
我嘗試了改變下命令列引數的方式:
brew reinstall git --with-brewed-openssl
結果是可以升級到最新的git版本的(git 2.6.4)