色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

為何多數git教程里添加遠程庫默認推薦ssh

劉姿婷2年前14瀏覽0評論

為何多數git教程里添加遠程庫默認推薦ssh?

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)