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