簡體中文 ▾ 主題 ▾ 最新版本 ▾ gitcvs-migration 最後更新於 2.12.5

名稱

gitcvs-migration - Git for CVS users

概要

git cvsimport *

描述

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 config -lgit-config[1] 手冊頁。

你可以透過先提交你的更改,然後使用 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 pushes 和 pulls;參見 git-shell[1]

將所有提交者放在同一個組中,並使該組可以寫入該倉庫:

$ chgrp -R $group /pub/my-repo.git

確保提交者的 umask 最多為 027,以便他們建立的目錄對其他組成員是可寫的和可搜尋的。

匯入 CVS 存檔

注意
這些說明使用了 git 自帶的 git-cvsimport 指令碼,但其他匯入器可能能提供更好的結果。有關其他選項,請參見 git-cvsimport[1] 中的註釋。

首先,安裝 cvsps 的 2.1 或更高版本,地址為 https://github.com/andreyvit/cvsps,並確保它在你的 PATH 中。然後 cd 到你感興趣的專案的已簽出的 CVS 工作副本目錄,並執行 git-cvsimport[1]

$ git cvsimport -C <destination> <module>

這會將名為 <destination> 的目錄中的 CVS 模組的 Git 存檔,如果該目錄不存在,則會建立它。

匯入會檢查 CVS 中的每個檔案的每個修訂版。據報道,cvsimport 每秒平均可以處理約二十個修訂版,因此對於中等規模的專案,這不應超過幾分鐘。大型專案或遠端倉庫可能需要更長時間。

主幹儲存在名為 origin 的 Git 分支中,其他 CVS 分支儲存在同名的 Git 分支中。主幹的最新版本也保留在 master 分支上籤出,因此你可以立即開始新增自己的更改。

匯入是增量的,所以如果你下個月再次呼叫它,它將獲取在此期間所做的任何 CVS 更新。要使其正常工作,你不能修改匯入的分支;而是為自己的更改建立新分支,並在需要時合併匯入的分支。

如果你想要一個共享倉庫,你需要按照上述說明製作一個匯入目錄的裸克隆。然後,為了合併增量匯入,將匯入的目錄視為另一個開發克隆。

高階共享倉庫管理

Git 允許你指定稱為“鉤子”的指令碼,以便在特定點執行。你可以使用它們,例如,將所有提交到共享倉庫的提交發送到郵件列表。參見 githooks[5]

你可以使用更新鉤子來強制執行更細粒度的許可權。參見 透過更新鉤子控制對分支的訪問

為 Git 倉庫提供 CVS 訪問

也可以為 Git 倉庫提供真正的 CVS 訪問,以便開發人員仍然可以使用 CVS;有關詳細資訊,請參見 git-cvsserver[1]

替代開發模型

CVS 使用者習慣於將一組開發人員的提交許可權授予一個公共倉庫。正如我們所見,這也適用於 Git。然而,Git 的分散式特性允許其他開發模型,你可能需要首先考慮其中一種是否更適合你的專案。

例如,你可以選擇一個人來維護專案的主要公共倉庫。其他開發人員然後克隆這個倉庫,並在他們自己的克隆中工作。當他們有一系列令他們滿意的更改時,他們會請求維護者從包含這些更改的分支進行拉取。維護者審查他們的更改並將它們拉取到主倉庫中,其他開發人員根據需要拉取主倉庫以保持同步。Linux 核心和其他專案使用該模型的變體。

對於一個小團隊,開發人員可能只是從彼此的倉庫中拉取更改,而無需中央維護者。

GIT

Git[1] 套件的一部分