設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.13.7 → 2.50.1 無變化
-
2.12.5
2017-09-22
- 2.11.4 無更改
-
2.10.5
2017-09-22
- 2.3.10 → 2.9.5 無變化
-
2.2.3
2015-09-04
- 2.1.4 無更改
-
2.0.5
2014-12-17
描述
Git 與 CVS 的不同之處在於,每個工作樹都包含一個帶有專案歷史完整副本的倉庫,並且沒有哪個倉庫本身比其他倉庫更重要。但是,您可以透過指定一個人們可以同步的共享倉庫來模擬 CVS 模型;本文件解釋瞭如何實現這一點。
需要對 Git 有一些基本瞭解。閱讀完 gittutorial[7] 和 gitglossary[7] 應該足夠了。
針對共享倉庫進行開發
假設在主機 foo.com 上的 /pub/repo.git 中設定了一個共享倉庫。那麼作為單個提交者,您可以透過 ssh 克隆共享倉庫:
$ git clone foo.com:/pub/repo.git/ my-project $ cd my-project
並進行修改。相當於 cvs update 的操作是:
$ git pull origin
它會合並自克隆操作以來其他人可能已完成的任何工作。如果您的工作樹中有未提交的更改,請在執行 git pull 之前先提交它們。
注意
|
pull 命令知道從何處獲取更新,這是因為第一次 git clone 命令設定了某些配置變數;有關詳細資訊,請參見 |
您可以透過先提交更改,然後使用 git push 命令來更新共享倉庫:
$ git push origin master
將這些提交“推”到共享倉庫。如果其他人最近更新了倉庫,git push 會像 cvs commit 一樣報錯,在這種情況下,您必須先拉取任何更改,然後才能再次嘗試推送。
在上述 git push 命令中,我們指定了要更新的遠端分支的名稱(master
)。如果我們省略它,git push 會嘗試更新遠端倉庫中與本地倉庫中的分支同名的任何分支。因此,最後的 push 可以透過以下任一方式完成:
$ git push origin $ git push foo.com:/pub/project.git/
只要共享倉庫除了 master
之外沒有其他分支。
設定共享倉庫
我們假設您已經為您的專案建立了一個 Git 倉庫,可能從零開始建立或從 tarball 建立(參見 gittutorial[7]),或者從一個已有的 CVS 倉庫匯入(參見下一節)。
假設您現有的倉庫位於 /home/alice/myproject。建立一個新的“裸”倉庫(一個沒有工作樹的倉庫),並將您的專案拉取到其中:
$ mkdir /pub/my-repo.git $ cd /pub/my-repo.git $ git --bare init --shared $ git --bare fetch /home/alice/myproject master:master
接下來,為每個團隊成員提供對該倉庫的讀/寫訪問許可權。一種簡單的方法是讓所有團隊成員都能透過 ssh 訪問託管該倉庫的機器。如果您不想授予他們對機器的完整 shell 訪問許可權,則有一個受限 shell,它只允許使用者執行 Git 推送和拉取;請參見 git-shell[1]。
將所有提交者放在同一個組中,並使該倉庫對該組可寫:
$ chgrp -R $group /pub/my-repo.git
確保提交者的 umask 最大為 027,以便他們建立的目錄可被其他組成員寫入和搜尋。
匯入 CVS 歸檔
注意
|
這些說明使用 Git 附帶的 git-cvsimport 指令碼,但其他匯入器可能會提供更好的結果。有關其他選項,請參見 git-cvsimport[1] 中的註釋。 |
首先,從 https://github.com/andreyvit/cvsps 安裝 2.1 或更高版本的 cvsps,並確保它在您的路徑中。然後 cd 到您感興趣的專案的已簽出 CVS 工作目錄中,並執行 git-cvsimport[1]:
$ git cvsimport -C <destination> <module>
這將把指定 CVS 模組的 Git 歸檔檔案放入 <destination> 目錄中,如果需要,該目錄將被建立。
匯入會從 CVS 中檢出每個檔案的每個版本。據報道,cvsimport 平均每秒可以處理大約二十個版本,因此對於一箇中等規模的專案,這應該不會超過幾分鐘。大型專案或遠端倉庫可能需要更長時間。
主幹儲存在名為 origin
的 Git 分支中,其他 CVS 分支儲存在同名的 Git 分支中。主幹的最新版本也保留在 master
分支上,因此您可以立即開始新增自己的更改。
匯入是增量的,因此如果您下個月再次呼叫它,它將獲取在此期間已進行的任何 CVS 更新。為了實現這一點,您不得修改匯入的分支;相反,為您的更改建立新分支,並根據需要合併匯入的分支。
如果您想要一個共享倉庫,您將需要如上所述對匯入的目錄進行裸克隆。然後將匯入的目錄視為用於合併增量匯入的另一個開發克隆。
高階共享倉庫管理
Git 允許您指定在特定點執行的名為“鉤子”的指令碼。例如,您可以使用這些指令碼將所有提交發送到共享倉庫到郵件列表。請參見 githooks[5]。
您可以使用更新鉤子強制執行更細粒度的許可權。請參見 使用更新鉤子控制分支訪問。
為 Git 倉庫提供 CVS 訪問
也可以為 Git 倉庫提供真正的 CVS 訪問,以便開發人員仍然可以使用 CVS;有關詳細資訊,請參見 git-cvsserver[1]。
替代開發模型
CVS 使用者習慣於讓一組開發人員擁有對公共倉庫的提交訪問許可權。正如我們所看到的,Git 也可以實現這一點。然而,Git 的分散式特性允許其他開發模型,您可能需要首先考慮其中之一是否更適合您的專案。
例如,您可以選擇一個人來維護專案的主要公共倉庫。其他開發人員克隆此倉庫並在他們自己的克隆中工作。當他們有一系列滿意的更改時,他們會要求維護者從包含更改的分支中拉取。維護者審查他們的更改並將其拉取到主倉庫中,其他開發人員根據需要從主倉庫拉取以保持協調。Linux 核心和其他專案使用此模型的變體。
對於小團隊,開發人員可以直接從彼此的倉庫中拉取更改,而無需中央維護者。