產品協同設計第三組

Git教材 << Previous Next >> 分散式的Git

伺服器上的Git

Git可以使用四種主要協議來傳輸數據:
Local protocols、HTTP、Secure Shell(SSH)和Git。

通過上方多種方式啟動並運行遠程Git存儲庫,以便您可以與其他人協作或共享您的工作。

運行自己的服務器可以為您提供很多控制,並允許您在自己的防火牆內運行服務器,但是這樣的服務器通常需要相當多的時間來設置和維護。

通訊協定種類

Local protocols

優點:

1.可以直接將存儲庫副本粘貼到每個人都具有共享存取權限的位置,並像設置任何其他共享目錄一樣設置讀/寫權限。

2.運用這些指令(git pull /home/john/project等),通常會更簡單地使他們推送到遠端,並且您也方便拉取。

缺點:

1.共享存取通常更難以從多個位置進行設置和存取。

2.若在家使用筆電的話,需額外安裝遠端系統,否則會相對於基本網路存取還要來得困難與慢上許多。

3.每個用戶都具有對“遠程”目錄的完全要訪問權限,並且沒有任何東西阻止他們更改或刪除內部Git文件並破壞存儲庫。

SSH通訊協定(Secure Shell)

優點:

1.SSH相對容易設置,且它的守護程序很常見。

2.透過SSH存取是安全的,所有數據傳輸都經過加密和身份驗證。

3.像HTTP/S、Git與Local protocols一樣,使數據在傳輸之前盡可能緊湊。

缺點:

1.無法通過它對存儲庫進行匿名存取。

2.如果想允許匿名存取項目並且還想使用SSH,則必須設置SSH以便推送,但其他內容可供其他人獲取。

Git協定

優點:

1.為最快的網絡傳輸協議。

2.若為公共項目提供大量流量或為不需要用戶身份驗證進行讀取的大型項,則可能需要設置Git守護程序。

3.Git存儲庫可供所有人克隆。

缺點:

1.缺乏身份驗證。

2.通常為唯一存取權限(即推送、寫入等),若開啟推送存取權限,則網路上能到找到項目的URL並任何人可推送到項目裡。

HTTP

可分為兩種,分別為新制(智能)與舊制。

新制(智能):

與SSH或Git協定的運行方式非常相似,它可以設置為像git://協議一樣匿名服務,也可以通過SSH協議等身份驗證和加密來推送。

舊制:

直接將Git存儲庫提供為來自Web服務器的普通文件,優點在於設置它的簡單性。此外,任何可以訪問放置存儲庫的Web服務器的人都可以存取您的存儲庫。

以下優缺點於新制(智能)HTTP

優點:

1.能夠使用用戶名和密碼進行身份驗證。

2.通過HTTPS以只讀方式提供存儲庫。

缺點:

與某些服務器上的SSH相比,在HTTP/S上使用Git可能會有點棘手。

在伺服器上佈署Git

要clone存儲庫以創建新的存儲庫,請使用該--bare選項運行clone命令。將存儲庫目錄結束.git。如下:

$ git clone --bare my_project my_project.git

現在應該在目錄中擁有Git目錄數據的副本my_project.git。

下面指令相當於類似的東西,但配置文件中存在一些細微差別。

$ cp -Rf my_project/.git my_project.git

將存儲庫複製到以下來設置新存儲庫:

假設/srv/git存在於該服務器上,並且已經設置了一個名為git.example.com的SSH服務器,而希望將所有Git存儲庫存儲在該/srv/git目錄下。

$ scp -r my_project.git user@git.example.com:/srv/git

之後,對於有這目錄及SSH的權限的用戶就可以來clone,也有推送訪問權限。

$ git clone user@git.example.com:/srv/git/my_project.git

如果git init使用該--shared選項運行命令,Git將自動將組寫入權限正確添加到存儲庫。

$ ssh user@git.example.com
$ cd /srv/git/my_project.git
$ git init --bare --shared

產生個人的SSH公鑰

在該目錄並列出內容來輕鬆檢查是否已有密鑰。
輸入指令後有出現文件為id_dsa(id_rsa)為自己私人的密鑰,而文件後方多了.pub則為公鑰。如下:
~/.ssh為目錄

$ cd ~/.ssh

$ ls

authorized_keys2

id_dsa

known_hosts

config

id_dsa.pub

如沒有密鑰時,可輸入下列指令來創建。

$ ssh-keygen

之後,會需要確保密鑰(.ssh/id_rsa)的位置,需輸入兩次密碼,不需要則可空白。

如用戶需要複製有公鑰文件的內容,輸入下列指令。
~/.ssh/id_rsa為公鑰位置

$ cat ~/.ssh/id_rsa.pub

伺服器的設定

如要設置SSH存取的服務端,則需使用下列方式來進行身分驗證。

**git為用戶名、 .ssh為目錄、authorized_keys為驗證**

$ sudo adduser git

$ su git

$ cd

$ mkdir .ssh && chmod 700 .ssh

$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

如需要為該用戶的文件添加一些開發人員的SSH公鑰,並將其保存到臨時文件中。如下:

**john為開發人員的SSH公鑰**

$ cat /tmp/id_rsa.john.pub

在一個沒有工作目錄的情況下設置一個空儲存庫。

$ cd /opt/git

$ mkdir project.git

$ cd project.git

$ git init --bare

將文件推送至遠端儲存庫。

**myproject為文件**

Git常駐程式

如不想將大量的項目或人員都添加SSH密鑰時,以守護進程的方式運行下列指令:
此方法雖然設置方便而快速,但因沒有密鑰的身分驗證,所以任何人都可以存取裡面的內容。多用於世界性的公開項目。

$ git daemon --reuseaddr --base-path=/opt/git/ /opt/git/

--reuseaddr是允許服務器重新啟動而無需等待舊連接超時

--base-path是允許人們克隆項目而不指定整個路徑

**最後的路徑需告訴Git守護程序在哪裡查找要導出的存儲庫**

如果你正在運行防火牆,你還需要在你正在設置它的盒子上的端口9418處打一個洞。
但建議將此守護程序作為具有存儲庫的唯讀權限的用戶運行。

在Ubuntu計算機上,您可以使用Upstart的腳本,並在文件中放入腳本。

**文件為/etc/init/local-git-daemon.conf**

腳本:

start on startup

stop on shutdown

exec /usr/bin/git daemon \

--user=git --group=git \

--reuseaddr \

--base-path=/opt/git/ \

/opt/git/

respawn

要在不重新啟動的情況下運行計算機時

$ initctl start local-git-daemon

允許未經身份驗證的用戶存取指定的儲存庫。

$ cd /path/to/project.git

$ touch git-daemon-export-ok


Git教材 << Previous Next >> 分散式的Git