設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.50.1 無更改
-
2.50.0
2025-06-16
- 2.44.1 → 2.49.1 無更改
-
2.44.0
2024-02-23
- 2.42.1 → 2.43.7 無變更
-
2.42.0
2023-08-21
- 2.37.3 → 2.41.3 無變更
-
2.37.2
2022-08-11
- 2.33.2 → 2.37.1 無變更
-
2.33.1
2021-10-12
- 2.32.1 → 2.33.0 無更改
-
2.32.0
2021-06-06
- 2.25.1 → 2.31.8 無變更
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 無更改
-
2.23.0
2019-08-16
- 2.18.1 → 2.22.5 無更改
-
2.18.0
2018-06-21
- 2.16.6 → 2.17.6 無更改
-
2.15.4
2019-12-06
- 2.10.5 → 2.14.6 無變更
-
2.9.5
2017-07-30
- 2.5.6 → 2.8.6 無更改
-
2.4.12
2017-05-05
- 2.3.10 無更改
-
2.2.3
2015-09-04
- 2.1.4 無更改
-
2.0.5
2014-12-17
概要
SSH
export CVS_SERVER="git cvsserver" cvs -d :ext:user@server/path/repo.git co <HEAD_name>
pserver (/etc/inetd.conf)
cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver
用法
git-cvsserver [<options>] [pserver|server] [<directory> …]
描述
此應用程式是 Git 的 CVS 模擬層。
它功能強大。但是,並非所有方法都已實現,對於已實現的方法,也並非所有開關都已實現。
測試已使用 CLI CVS 客戶端和 Eclipse CVS 外掛完成。大多數功能在這兩個客戶端上都能正常工作。
選項
所有這些選項顯然只有在伺服器端強制執行時才有意義。它們的實現旨在儘可能地模仿 git-daemon[1] 選項。
限制
CVS 客戶端無法打標籤、建立分支或執行 Git 合併。
git-cvsserver 將 Git 分支對映到 CVS 模組。這與大多數 CVS 使用者預期的非常不同,因為在 CVS 中,模組通常代表一個或多個目錄。
安裝
-
如果您打算透過 pserver 提供 CVS 訪問,請在 /etc/inetd.conf 中新增一行,如下所示:
cvspserver stream tcp nowait nobody git-cvsserver pserver
注意:有些 inetd 伺服器允許您獨立於 argv[0] 的值(即程式假定其執行時所用的名稱)指定可執行檔案的名稱。在這種情況下,/etc/inetd.conf 中正確的行如下所示:
cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver
預設情況下,pserver 只提供匿名訪問。要提交,您必須建立 pserver 帳戶,只需在您希望 cvsserver 允許寫入的倉庫的配置檔案中新增 gitcvs.authdb 設定,例如:
[gitcvs] authdb = /etc/cvsserver/passwd
這些檔案的格式是使用者名稱,後跟加密密碼,例如:
myuser:sqkNi8zPf01HI myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/ myuser:$5$.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3
您可以使用 Apache 附帶的 htpasswd 工具來建立這些檔案,但只能使用 -d 選項(如果您的系統支援,則使用 -B)。
最好使用管理您平臺中密碼雜湊建立的系統特定實用程式(例如 Linux 中的 mkpasswd、OpenBSD 中的 encrypt 或 NetBSD 中的 pwhash),並將其貼上到正確的位置。
然後透過 pserver 方法提供您的密碼,例如:
cvs -d:pserver:someuser:somepassword@server:/path/repo.git co <HEAD_name>
SSH 訪問除了在 PATH 中擁有 Git 工具外,不需要特殊設定。如果您的客戶端不接受 CVS_SERVER 環境變數,您可以將 git-cvsserver 重新命名為
cvs
。注意:較新的 CVS 版本(>= 1.12.11)也支援直接在 CVSROOT 中指定 CVS_SERVER,例如:
cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <HEAD_name>
這有一個優點,它將儲存到您的 CVS/Root 檔案中,您無需擔心總是設定正確的環境變數。受限於 git-shell 的 SSH 使用者無需使用 CVS_SERVER 覆蓋預設值(也不應該),因為 git-shell 將
cvs
理解為 git-cvsserver,並假裝另一端執行的是真正的 cvs。 -
對於您希望透過 CVS 訪問的每個倉庫,您都需要編輯倉庫中的配置並新增以下部分。
[gitcvs] enabled=1 # optional for debugging logFile=/path/to/logfile
注意:您需要確保將要呼叫 git-cvsserver 的每個使用者都對日誌檔案和資料庫具有寫訪問許可權(參見資料庫後端)。如果您想透過 SSH 提供寫訪問,使用者當然也需要對 Git 倉庫本身具有寫訪問許可權。
您還需要確保每個倉庫都是“裸倉庫”(沒有 Git 索引檔案),以便
cvs
commit
能夠工作。請參閱 gitcvs-migration[7]。所有配置變數也可以針對特定的訪問方法進行覆蓋。有效的訪問方法名稱是“ext”(用於 SSH 訪問)和“pserver”。以下示例配置將停用 pserver 訪問,同時仍允許透過 SSH 訪問。
[gitcvs] enabled=0 [gitcvs "ext"] enabled=1
-
如果您沒有在檢出命令中直接指定 CVSROOT/CVS_SERVER,而是自動將其儲存到您的 CVS/Root 檔案中,那麼您需要明確地在您的環境中設定它們。CVSROOT 應該像往常一樣設定,但目錄應指向相應的 Git 倉庫。如上所述,對於不受限於 git-shell 的 SSH 客戶端,CVS_SERVER 應設定為 git-cvsserver。
export CVSROOT=:ext:user@server:/var/git/project.git export CVS_SERVER="git cvsserver"
-
對於將進行提交的 SSH 客戶端,請確保其伺服器端 .ssh/environment 檔案(或 .bashrc 等,根據其特定的 shell)匯出 GIT_AUTHOR_NAME、GIT_AUTHOR_EMAIL、GIT_COMMITTER_NAME 和 GIT_COMMITTER_EMAIL 的適當值。對於登入 shell 為 bash 的 SSH 客戶端,.bashrc 可能是一個合理的替代方案。
-
客戶端現在應該能夠檢出專案。使用 CVS 模組名稱來指示您要檢出哪個 Git head。這也設定了您新檢出目錄的名稱,除非您使用
-d
<dir-name> 另行指定。例如,這將把 master 分支檢出到project-master
目錄:cvs co -d project-master master
資料庫後端
git-cvsserver 為每個 Git head(即 CVS 模組)使用一個數據庫來儲存關於倉庫的資訊,以保持一致的 CVS 修訂號。資料庫需要在每次提交後更新(即寫入)。
如果提交是直接使用 git
完成的(而不是使用 git-cvsserver),則更新將需要在 git-cvsserver 下次訪問倉庫時進行,這與訪問方法和請求操作無關。
這意味著,即使您只提供讀訪問(例如,透過使用 pserver 方法),git-cvsserver 也應該對資料庫具有寫訪問許可權才能可靠工作(否則您需要確保在每次執行 git-cvsserver 時資料庫都是最新的)。
預設情況下,它在 Git 目錄中使用 SQLite 資料庫,命名為 gitcvs.
<module-name>.sqlite
。請注意,SQLite 後端在寫入時會在與資料庫檔案相同的目錄中建立臨時檔案,因此僅授予使用 git-cvsserver 的使用者對資料庫檔案的寫訪問許可權可能不足夠,還需要授予他們對目錄的寫訪問許可權。
在跟蹤的分支更改後,資料庫無法以一致的形式可靠地重新生成。示例:對於合併的分支,git-cvsserver 只跟蹤一個開發分支,在 git merge 之後,增量更新的資料庫可能跟蹤與從頭重新生成的資料庫不同的分支,從而導致不一致的 CVS 修訂號。git-cvsserver
無法知道如果在合併前增量執行它會選擇哪個分支。因此,如果您必須完全或部分(從舊備份)重新生成資料庫,則應對現有 CVS 沙盒持懷疑態度。
您可以使用以下配置變數來配置資料庫後端:
配置資料庫後端
git-cvsserver 使用 Perl DBI 模組。在更改這些變數時,請務必閱讀其文件,特別是關於 DBI->connect() 的部分。
- gitcvs.dbName
-
資料庫名稱。確切含義取決於所選的資料庫驅動程式,對於 SQLite,這是一個檔名。支援變數替換(見下文)。不能包含分號(;)。預設值:%Ggitcvs.%m.sqlite
- gitcvs.dbDriver
-
使用的 DBI 驅動程式。您可以在此處指定任何可用的驅動程式,但它可能無法工作。cvsserver 已使用 DBD::SQLite 進行測試,據報告與 DBD::Pg 相容,但報告不相容 DBD::mysql。請將此視為實驗性功能。不能包含冒號(
:
)。預設值:SQLite - gitcvs.dbuser
-
資料庫使用者。僅在設定
dbDriver
時有用,因為 SQLite 沒有資料庫使用者的概念。支援變數替換(見下文)。 - gitcvs.dbPass
-
資料庫密碼。僅在設定
dbDriver
時有用,因為 SQLite 沒有資料庫密碼的概念。 - gitcvs.dbTableNamePrefix
-
資料庫表名字首。支援變數替換(見下文)。任何非字母字元都將被下劃線替換。
所有變數也可以按訪問方法設定,參見上文。
ECLIPSE CVS 客戶端注意事項
使用 Eclipse CVS 客戶端進行檢出
-
選擇“建立新專案 → 從 CVS 檢出”
-
建立新位置。有關如何選擇正確協議的詳細資訊,請參閱下面的注意事項。
-
瀏覽可用的模組。它將為您提供倉庫中頭部的列表。您將無法從那裡瀏覽樹。只能瀏覽頭部。
-
當它詢問要檢出哪個分支/標籤時,選擇
HEAD
。取消選中“啟動提交嚮導”以避擴音交 .project 檔案。
協議注意事項:如果您透過 pserver 使用匿名訪問,只需選擇它。使用 SSH 訪問的使用者應該選擇 ext 協議,並在“首選項→團隊→CVS→ExtConnection”窗格中配置 ext 訪問。將 CVS_SERVER 設定為“git
cvsserver
”。請注意,使用 ext 時密碼支援不佳,您肯定需要設定 SSH 金鑰。
或者,您可以直接使用 Eclipse 提供的非標準 extssh 協議。在這種情況下,CVS_SERVER 被忽略,您將不得不將伺服器上的 cvs 工具替換為 git-cvsserver,或者修改您的 .bashrc
,以便呼叫 cvs 實際上是呼叫 git-cvsserver。
已知可用的客戶端
-
Debian 上的 CVS 1.12.9
-
MacOSX 上的 CVS 1.11.17 (來自 Fink 包)
-
MacOSX 上的 Eclipse 3.0, 3.1.2 (參見 Eclipse CVS 客戶端注意事項)
-
TortoiseCVS
支援的操作
支援所有正常使用所需的操作,包括檢出(checkout)、差異(diff)、狀態(status)、更新(update)、日誌(log)、新增(add)、移除(remove)、提交(commit)。
大多數讀取 CVS 標籤或修訂號的 CVS 命令引數(通常是 -r)都可以工作,並且也支援任何 Git refspec(標籤、分支、提交 ID 等)。但是,非預設分支的 CVS 修訂號模擬不佳,並且 cvs log 根本不顯示標籤或分支。(非主分支的 CVS 修訂號表面上類似於 CVS 修訂號,但它們實際上直接編碼了 Git 提交 ID,而不是表示自分支點以來的修訂次數。)
請注意,有兩種方式可以檢出特定分支。如本頁其他地方所述,cvs checkout 的“module”引數被解釋為分支名稱,併成為主分支。即使您暫時使用 cvs update -r 使另一個分支具有粘性,它對於給定的沙盒仍然是主分支。或者,-r 引數可以指示要實際檢出的其他分支,即使該模組仍然是“主”分支。權衡(目前實現):每個新“模組”都會在磁碟上建立一個新資料庫,其中包含給定模組的歷史記錄,並且在建立資料庫後,針對該主分支的操作速度很快。或者,-r 不會佔用任何額外的磁碟空間,但對於許多操作(如 cvs update)可能會明顯慢得多。
如果您想引用一個包含 CVS 不允許字元的 Git refspec,您有兩種選擇。首先,直接將 Git refspec 提供給相應的 CVS -r 引數可能就能工作;一些 CVS 客戶端似乎對引數沒有進行太多健全性檢查。其次,如果失敗,您可以使用一種特殊的字元轉義機制,該機制只使用 CVS 標籤中有效的字元。由 4 或 5 個字元組成的序列,其形式為(下劃線("_"
)、破折號("-"
)、一個或兩個字元和破折號("-"
))可以根據一個或兩個字母編碼各種字元:"s"
代表斜槓("/"
),"p"
代表句點("."
),"u"
代表下劃線("_"
),或者兩個十六進位制數字代表任何位元組值(通常是 ASCII 數字,或者可能是 UTF-8 編碼字元的一部分)。
不支援舊版監視操作(edit、watch 和相關操作)。此階段不支援匯出和標記(標籤和分支)。
CRLF 行尾轉換
預設情況下,伺服器將所有檔案的 -k
模式留空,這導致 CVS 客戶端將它們視為文字檔案,在某些平臺上會進行行尾轉換。
您可以透過設定 gitcvs.usecrlfattr
配置變數,使伺服器使用行尾轉換屬性來設定檔案的 -k
模式。有關行尾轉換的更多資訊,請參閱 gitattributes[5]。
或者,如果未啟用 gitcvs.usecrlfattr
配置,或者屬性不允許對檔名進行自動檢測,則伺服器使用 gitcvs.allBinary
配置作為預設設定。如果設定了 gitcvs.allBinary
,則未另行指定的檔案將預設為 -kb 模式。否則,-k
模式留空。但如果 gitcvs.allBinary
設定為“guess”,則將根據檔案內容猜測正確的 -k
模式。
為了與 cvs 保持最佳一致性,最好將 gitcvs.usecrlfattr
設定為 true,並將 gitcvs.allBinary
設定為“guess”來覆蓋預設值。