簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-cvsserver 最後更新於 2.50.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 <path>

在請求的 CVSROOT 前面加上 path

--strict-paths

不允許遞迴進入子目錄

--export-all

不檢查配置中的 gitcvs.enabled。如果您想使用此選項,還必須指定一個允許的目錄列表(見下文)。

-V
--version

列印版本資訊並退出

-h
-H
--help

列印用法資訊並退出

<directory>

剩餘引數提供目錄列表。如果未給定目錄,則允許所有目錄。除非指定了 --export-all,否則這些目錄中的倉庫仍需要 gitcvs.enabled 配置選項。

限制

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-shellcvs 理解為 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. 如果您沒有在檢出命令中直接指定 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. 客戶端現在應該能夠檢出專案。使用 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

資料庫表名字首。支援變數替換(見下文)。任何非字母字元都將被下劃線替換。

所有變數也可以按訪問方法設定,參見上文

變數替換

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

支援的操作

支援所有正常使用所需的操作,包括檢出(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”來覆蓋預設值。

依賴

git-cvsserver 依賴於 DBD::SQLite。

GIT

Git[1] 套件的一部分

scroll-to-top