?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
git-cvsserver - Git 的 CVS 服務(wù)器模擬器
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> …]
所有這些選項顯然只有在服務(wù)器端強制執(zhí)行時才有意義。它們已經(jīng)被實現(xiàn)為盡可能地與 git-daemon [1] 選項類似。
--base-path <path>
預(yù)先path
申請 CVSROOT
--strict-paths
不要允許遞歸到子目錄中
--export-all
不要gitcvs.enabled
在配置中檢查。如果要使用此選項,還必須指定允許的目錄列表(請參見下文)。
-V --version
打印版本信息并退出
-h -H --help
打印使用情況信息并退出
<directory>
您可以指定允許的目錄列表。如果沒有給出目錄,則全部允許。這是一個額外的限制,gitcvs 訪問仍然需要gitcvs.enabled
配置選項啟用,除非--export-all
被給予。
此應(yīng)用程序是 Git 的 CVS 仿真層。
它功能強大。但是并非所有方法都已實施,對于已實施的方法,并非所有交換機都已實施。
使用 CLI CVS 客戶端和 Eclipse CVS 插件完成了測試。大多數(shù)功能都可以與這兩個客戶端正常工作。
CVS 客戶端不能標記,分支或執(zhí)行 Git 合并。
git-cvsserver
將 Git 分支映射到 CVS 模塊。這與大多數(shù) CVS 用戶所期望的完全不同,因為在 CVS 中,模塊通常代表一個或多個目錄。
如果您要通過 pserver 提供 CVS 訪問,請在 /etc/inetd.conf 中添加一行,如 cvspserver stream tcp nowait nobody git-cvsserver pserver
注意:某些 inetd 服務(wù)器允許您指定獨立于 argv0 值的可執(zhí)行文件的名稱。在這種情況下,/etc/inetd.conf 中的正確行看起來像
cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver
pserve 默認只提供匿名訪問。要提交,您必須創(chuàng)建 pserver 帳戶,只需在要讓 cvsserver 允許寫入的存儲庫的配置文件中添加 gitcvs.authdb 設(shè)置,例如:
[gitcvs] authdb = /etc/cvsserver/passwd
這些文件的格式是用戶名后跟加密的密碼,例如:
myuser:$1Oyx5r9mdGZ2 myuser:$1$BA)@$vbnMJMDym7tA32AamXrm./
您可以使用htpasswd
Apache 提供的工具來生成這些文件,但是 Apache 的 MD5 加密方法與大多數(shù) C 庫的 crypt()函數(shù)所使用的方法不同,因此不要使用 -m 選項。
或者,你可以用 perl 的 crypt()運算符產(chǎn)生密碼:
perl -e 'my ($user, $pass) = @ARGV; printf "%s:%s\n", $user, crypt($user, $pass)' $USER password
然后通過 pserver 方法提供您的密碼,例如:
cvs -d:pserver:someuser:somepassword <at> server/path/repo.git co <HEAD\_name>
除了在 PATH 中使用 Git 工具之外,SSH 訪問不需要任何特殊設(shè)置。如果您的客戶端不接受 CVS_SERVER 環(huán)境變量,則可以重命名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
文件中,你不必擔心總是設(shè)置正確的環(huán)境變量。受限制的 SSH 用戶git-shell
不需要用 CVS_SERVER 覆蓋缺省值(而且不應(yīng)該)git-shell
理解cvs
為意味著git-cvsserver
并假裝另一端運行得cvs
更好。
對于您想要從 CVS 訪問的每個回購,您需要編輯回購中的配置并添加以下部分。gitcvs enabled = 1??蛇x,用于調(diào)試 logFile = / path / to / logfile
注意:您需要確保要調(diào)用的每個用戶git-cvsserver
都有對日志文件和數(shù)據(jù)庫的寫入權(quán)限(請參閱 Database Backend 。如果您想通過 SSH 提供寫入權(quán)限,用戶當然也需要對 Git 的寫入權(quán)限存儲庫本身。
您還需要確保每個存儲庫都是 “bare”(沒有 Git 索引文件)cvs commit
才能工作。請參閱 gitcvs-migration [7]。
對于特定的訪問方法,所有配置變量也可以被覆蓋。有效的方法名稱是 “ext”(用于 SSH 訪問)和 “pserver” 。以下示例配置將禁用 pserver 訪問,同時仍允許通過 SSH 進行訪問。
[gitcvs] enabled=0 [gitcvs "ext"] enabled=1
如果您沒有直接在 checkout 命令中指定 CVSROOT / CVS_SERVER ,將其自動保存在CVS/Root
文件中,那么您需要在您的環(huán)境中明確設(shè)置它們。CVSROOT 應(yīng)該按照正常進行設(shè)置,但目錄應(yīng)該指向適當?shù)?Git 倉庫。如上所述,對于not
限制為 SSH 的客戶端git-shell
,應(yīng)將 CVS_SERVER 設(shè)置為git-cvsserver
。export CVSROOT =:ext:user @ server:/var/git/project.git export CVS_SERVER =“git cvsserver”
對于將進行提交的 SSH 客戶端,請確保其服務(wù)器端 .ssh /environment 文件(或 .bashrc 等,根據(jù)其特定的外殼)為 GIT_AUTHOR_NAME ,GIT_AUTHOR_EMAIL ,GIT_COMMITTER_NAME 和 GIT_COMMITTER_EMAIL 導(dǎo)出適當?shù)闹?。對于登?shell 為 bash 的 SSH 客戶端,.bashrc 可能是一個合理的選擇。
客戶現(xiàn)在應(yīng)該能夠檢查項目。使用 CVS module
名稱來表明head
你想要簽出的 Git 。這也設(shè)置了新檢出目錄的名稱,除非您另有說明-d <dir_name>
。例如,這將檢查master
分支到project-master
目錄:cvs co -d project-master master
git-cvsserver
每個 Git 頭部(即 CVS 模塊)使用一個數(shù)據(jù)庫來存儲關(guān)于存儲庫的信息以保持一致的 CVS 修訂號。數(shù)據(jù)庫需要在每次提交后更新(即寫入)。
如果提交是通過使用git
(而不是使用git-cvsserver
)直接完成的,則更新將需要在下一個存儲庫訪問時發(fā)生git-cvsserver
,與訪問方法和請求的操作無關(guān)。
這意味著,即使您只提供讀訪問權(quán)限(例如通過使用pserver方法),也git-cvsserver
應(yīng)該具有對數(shù)據(jù)庫的寫訪問權(quán)限以便可靠地工作(否則,您需要確保數(shù)據(jù)庫在任何時候git-cvsserver
執(zhí)行都是最新的) 。
默認情況下,它使用 Git 目錄中的 SQLite 數(shù)據(jù)庫,名為gitcvs.<module_name>.sqlite
。請注意,SQLite 后端在寫入數(shù)據(jù)庫文件的同一目錄中創(chuàng)建臨時文件,因此它可能不足以授予用戶git-cvsserver
對數(shù)據(jù)庫文件的寫入訪問權(quán)限,但不授予它們對目錄的寫入訪問權(quán)限。
在跟蹤發(fā)生變化的分支后,數(shù)據(jù)庫不能以一致的形式可靠地重新生成。示例:對于合并分支,git-cvsserver
僅跟蹤開發(fā)的一個分支,并且在git merge
增量更新的數(shù)據(jù)庫跟蹤與從頭開始重新生成的數(shù)據(jù)庫不同的分支之后,會導(dǎo)致 CVS 修訂版編號不一致。git-cvsserver
沒有辦法知道哪個分支它會選擇如果它已經(jīng)逐步運行預(yù)合并。因此,如果您必須完全或部分(從舊備份)重新生成數(shù)據(jù)庫,則應(yīng)該懷疑預(yù)先存在的 CVS 沙箱。
您可以使用以下配置變量來配置數(shù)據(jù)庫后端:
git-cvsserver
使用 Perl DBI 模塊。如果更改這些變量,請閱讀它的文檔,尤其是關(guān)于DBI->connect()
。
gitcvs.dbName
數(shù)據(jù)庫名稱。確切的含義取決于選定的數(shù)據(jù)庫驅(qū)動程序,對于 SQLite 這是一個文件名。支持變量替換(見下文)。不能包含分號(;
)。默認:%Ggitcvs.%m.sqlite
gitcvs.dbDriver
使用的 DBI 驅(qū)動程序。你可以在這里指定任何可用的驅(qū)動程序,但它可能不起作用。cvsserver 已經(jīng)過測試DBD::SQLite
,報告可以使用DBD::Pg
,并且報告不能使用DBD::mysql
。請將此視為實驗性功能。不能包含冒號(:
)。默認:SQLite
gitcvs.dbuser
數(shù)據(jù)庫用戶。只有在設(shè)置時才有用dbDriver
,因為 SQLite 沒有數(shù)據(jù)庫用戶的概念。支持變量替換(見下文)。
gitcvs.dbPass
數(shù)據(jù)庫密碼。只有在設(shè)置時才有用dbDriver
,因為 SQLite 沒有數(shù)據(jù)庫密碼的概念。
gitcvs.dbTableNamePrefix
數(shù)據(jù)庫表名稱前綴。支持變量替換(見下文)。任何非字母字符將被替換為下劃線。
所有變量也可以根據(jù)訪問方法設(shè)置,參見上文。
在dbDriver
和dbUser
你可以使用以下變量:
%G
Git 目錄名稱
%g
Git 的目錄名,其中除字母數(shù)字以外的所有字符.
,并-
與更換_
(這應(yīng)該更容易地在文件名中使用的目錄名稱,如果想)
%m
CVS 模塊 / Git 頭名稱
%a
訪問方法(“ext” 或 “pserver” 之一)
%u
正在運行的用戶的名稱git-cvsserver
。如果不能確定名稱,則使用數(shù)字 uid 。
在某些情況下,這些變量可以避免使用命令行選項,從而通過 git-shell 更容易地限制使用。
GIT_CVSSERVER_BASE_PATH 取代了 --base-path 的參數(shù)。
GIT_CVSSERVER_ROOT 指定單目錄白名單。如上所述,存儲庫仍必須配置為允許通過 git-cvsserver 進行訪問。
當設(shè)置這些環(huán)境變量時,可能不會使用相應(yīng)的命令行參數(shù)。
要使用 Eclipse CVS 客戶端進行結(jié)帳,請執(zhí)行以下操作:
選擇“創(chuàng)建新項目→從 CVS 簽出”
創(chuàng)建一個新的位置。有關(guān)如何選擇正確協(xié)議的詳細信息,請參閱下面的注釋。
瀏覽modules
可用。它會給你一個存儲庫中頭的列表。你將無法從那里瀏覽樹。只有頭部。
挑選HEAD
時,它會詢問什么分支/標簽退房。取消“啟動提交向?qū)А币员苊馓峤?.project 文件。
協(xié)議說明:如果您通過 pserver 使用匿名訪問,請選擇該選項。那些使用 SSH 訪問的應(yīng)該選擇ext
協(xié)議,并ext
在首選項→團隊→ CVS → ExtConnection 窗格中配置訪問權(quán)限。將 CVS_SERVER 設(shè)置為“ git cvsserver
”。請注意,密碼支持在使用時不好ext
,你一定會想要設(shè)置 SSH 密鑰。
或者,您可以使用 Eclipse 提供的非標準 extssh 協(xié)議。在這種情況下,CVS_SERVER 將被忽略,并且您將不得不用服務(wù)器上的 cvs 實用程序替換git-cvsserver
或操作您的服務(wù)器,.bashrc
以便cvs
有效地調(diào)用呼叫git-cvsserver
。
CVS 1.12.9在 Debian 上
MacOSX 上的 CVS 1.11.17(來自 Fink 包)
MacOSX 上的 Eclipse 3.0,3.1.2(請參閱 Eclipse CVS 客戶端注釋)
TortoiseCVS
支持正常使用所需的所有操作,包括checkout ,diff ,status ,update ,log ,add ,remove ,commit 。
大多數(shù)讀取 CVS 標簽或版本號(通常是 -r )的 CVS 命令參數(shù)都可以工作,并且還支持任何 git refspec(標簽,分支,提交 ID 等)。但是,對于非默認分支的 CVS 修訂版編號沒有很好地模擬,并且 CVS 日志根本不顯示標簽或分支。(非主分支 CVS 修訂版本號與 CVS 修訂版號相似,但實際上它們直接編碼了一個 git commit ID ,而不是代表自分支點以來修訂版的數(shù)目。)
請注意,有兩種方法可以檢出特定的分支。如本頁其他地方所述,cvs checkout 的 “module” 參數(shù)被解釋為分支名稱,并且它將成為主分支。它仍然是給定沙箱的主要分支,即使您暫時使用 cvs update -r 使另一個分支變得粘稠。另外,即使模塊仍然是 “main” 分支,-r 參數(shù)可以指示其他分支實際結(jié)帳。權(quán)衡(當前實施):每個新的“模塊”在磁盤上為給定模塊創(chuàng)建一個新的數(shù)據(jù)庫歷史數(shù)據(jù)庫,創(chuàng)建數(shù)據(jù)庫后,對該主要分支的操作很快?;蛘撸?r 不會占用額外的磁盤空間,但對于許多操作(如 cvs update )可能會明顯較慢。
如果你想?yún)⒖家粋€ git refspec ,它有 CVS 不允許的字符,你有兩個選擇。首先,它可能只是將 git refspec 直接提供給適當?shù)?CVS -r 參數(shù); 一些 CVS 客戶似乎沒有對這個論點做太多的理智檢查。其次,如果失敗,您可以使用特殊字符轉(zhuǎn)義機制,它只使用在 CVS 標記中有效的字符。(下劃線("_"
),短劃線("-"
),一個或兩個字符以及短劃線("-"
))的4或5個字符的序列可以根據(jù)一個或兩個字母對各種字符進行編碼:"s"
for slash("/"
),"p"
for period("."
) ,"u"
用于下劃線("_"
),或者任何字節(jié)值(通常是 ASCII 碼,或者可能是 UTF-8 編碼字符的一部分)的兩個十六進制數(shù)字。
傳統(tǒng)監(jiān)控操作不受支持(編輯,監(jiān)視和相關(guān))。此階段不支持導(dǎo)出和標記(標記和分支)。
默認情況下,服務(wù)器將-k
所有文件的模式留空,這會導(dǎo)致 CVS 客戶端將它們視為文本文件,并受某些平臺上的行尾轉(zhuǎn)換影響。
您可以通過設(shè)置gitcvs.usecrlfattr
配置變量使服務(wù)器使用行尾轉(zhuǎn)換屬性來設(shè)置-k
的模式。請參閱 gitattributes [5] 以獲取有關(guān)行尾轉(zhuǎn)換的更多信息。
或者,如果gitcvs.usecrlfattr
config未啟用或者屬性不允許自動檢測文件名,則服務(wù)器使用gitcvs.allBinary
config作為默認設(shè)置。如果gitcvs.allBinary
已設(shè)置,則未指定的文件將默認為-kb
模式。否則,該-k
模式留空。但是如果gitcvs.allBinary
設(shè)置為“猜測”,則-k
根據(jù)文件的內(nèi)容猜測正確的模式。
為了達到最佳一致性cvs
,最好通過設(shè)置gitcvs.usecrlfattr
為 true 來覆蓋默認值,gitcvs.allBinary
“猜測”。
git-cvsserver
依賴于 DBD :: SQLite 。