Git
English ▾ 主題 ▾ 最新版本 ▾ git-cvsserver 最後更新於 2.44.0

名稱

git-cvsserver - Git 的 CVS 伺服器模擬器

概要

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] 的選項。

--base-path <路徑>

路徑 前置到請求的 CVSROOT

--strict-paths

不允許遞迴到子目錄

--export-all

不檢查組態中的 gitcvs.enabled。如果您想要使用此選項,您還必須指定允許目錄的清單(請參閱下方)。

-V
--version

列印版本資訊並結束

-h
-H
--help

列印使用資訊並結束

<目錄>

其餘引數提供目錄清單。如果未給定目錄,則允許所有目錄。這些目錄中的存放庫仍然需要 gitcvs.enabled 組態選項,除非指定 --export-all

限制

CVS 用戶端無法標記、分支或執行 Git 合併。

git-cvsserver 將 Git 分支對應到 CVS 模組。這與大多數 CVS 使用者所預期的非常不同,因為在 CVS 中,模組通常表示一個或多個目錄。

安裝

  1. 如果您要透過 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

  2. 對於您希望從 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
  3. 如果您未在 checkout 命令中直接指定 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"
  4. 對於會進行提交的 SSH 用戶端,請確保其伺服器端的 .ssh/environment 檔案(或 .bashrc 等,視其特定 shell 而定)為 GIT_AUTHOR_NAME、GIT_AUTHOR_EMAIL、GIT_COMMITTER_NAME 和 GIT_COMMITTER_EMAIL 匯出適當的值。對於登入 shell 為 bash 的 SSH 用戶端,.bashrc 可能是合理的替代方案。

  5. 用戶端現在應該能夠 check out 專案。使用 CVS 模組 名稱來指示您要 check out 的 Git head。這也會設定您新 check out 目錄的名稱,除非您使用 -d <目錄名稱> 另行告知。例如,這會將 master 分支 check out 到 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.<模組名稱>.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

資料庫表格名稱字首。支援變數取代(請參閱下方)。任何非字母字元都將取代為底線。

所有變數也可以針對每個存取方法設定,請參閱上方

變數取代

dbDriverdbUser 中,您可以使用以下變數

%G

Git 目錄名稱

%g

Git 目錄名稱,其中所有非字母數字的字元、.- 都會被取代為 _ (如果需要的話,這應該會讓目錄名稱更容易在檔案名稱中使用)

%m

CVS 模組/Git 頭部名稱

%a

存取方法 ( "ext" 或 "pserver" 其中之一)

%u

執行 git-cvsserver 的使用者名稱。如果無法決定名稱,則會使用數值 uid。

環境變數

在某些情況下,這些變數可避免使用命令列選項,允許透過 git-shell 更輕鬆地限制使用。

GIT_CVSSERVER_BASE_PATH

此變數取代 --base-path 的引數。

GIT_CVSSERVER_ROOT

此變數指定單一目錄,取代 <directory>... 引數清單。除非指定了 --export-all,否則儲存庫仍需 gitcvs.enabled 設定選項。

當設定這些環境變數時,不得使用相對應的命令列引數。

ECLIPSE CVS 用戶端注意事項

若要使用 Eclipse CVS 用戶端取得簽出

  1. 選擇 "建立新專案 → 從 CVS 簽出"

  2. 建立新的位置。請參閱下方關於如何選擇正確協定的詳細資訊。

  3. 瀏覽可用的模組。它會提供您儲存庫中頭部的清單。您將無法從那裡瀏覽樹狀結構。只有頭部。

  4. 當它詢問要簽出哪個分支/標籤時,選擇 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

支援的操作

支援正常使用所需的所有操作,包括簽出、差異、狀態、更新、日誌、新增、移除、提交。

大多數讀取 CVS 標籤或修訂編號 (通常為 -r) 的 CVS 命令引數都有效,並且也支援任何 git refspec (標籤、分支、提交 ID 等)。但是,非預設分支的 CVS 修訂編號模擬效果不佳,並且 cvs log 完全不會顯示標籤或分支。(非主分支的 CVS 修訂編號表面上與 CVS 修訂編號相似,但它們實際上直接編碼 git 提交 ID,而不是表示分支點以來的修訂次數。)

請注意,有兩種方法可以簽出特定分支。如本頁其他位置所述,cvs checkout 的「模組」參數會被解釋為分支名稱,並且它會成為主分支。即使您暫時使用 cvs update -r 使另一個分支具有黏性,對於給定的沙箱,它仍然是主分支。或者,-r 引數可以指示要實際簽出的其他分支,即使模組仍然是「主」分支。權衡 (目前實作方式):每個新的「模組」都會在磁碟上建立一個新的資料庫,其中包含給定模組的歷史記錄,並且在建立資料庫之後,針對該主分支的操作會很快。或者,-r 不會佔用任何額外的磁碟空間,但對於許多操作 (例如 cvs update) 而言,可能會明顯較慢。

如果您想參照 CVS 不允許的字元的 git refspec,您有兩個選項。首先,直接將 git refspec 提供給適當的 CVS -r 引數可能可以運作;某些 CVS 用戶端似乎不會對引數進行太多健全性檢查。其次,如果失敗,您可以使用特殊的字元跳脫機制,該機制僅使用 CVS 標籤中有效的字元。形式為 (底線 ("_")、破折號 ("-")、一或兩個字元和破折號 ("-")) 的 4 或 5 個字元的序列可以根據一或兩個字母來編碼各種字元:"s" 代表斜線 ("/")、"p" 代表句點 (".")、"u" 代表底線 ("_"),或者兩個十六進位數字代表任何位元組值 (通常是 ASCII 數字,或可能是 UTF-8 編碼字元的一部分)。

不支援舊版的監控操作 (編輯、觀察和相關操作)。目前階段不支援匯出和標記 (標籤和分支)。

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」,來覆寫預設值。

相依性

git-cvsserver 依賴 DBD::SQLite。

GIT

git[1] 套件的一部分

scroll-to-top