公司最近有意將版本控制工具從VSS和CVS切換到Git上,由于之前的項(xiàng)目一直是使用VSS和CVS進(jìn)行版本管理,這次遷移免不了要涉及VSS和CVS版本庫向Git進(jìn)行轉(zhuǎn)換的工作。
帶著這個目的,我先嘗試著找到VSS到Git遷移的可行方案,因?yàn)槲抑暗捻?xiàng)目一直也是用VSS進(jìn)行版本管理,相對于從沒有使用過的CVS而言,應(yīng)該更容易上手一些。至于CVS如何遷移到Git會在后面進(jìn)行研究。
之前在學(xué)習(xí)使用GitStack搭建Git服務(wù)器時(shí),在其官方網(wǎng)站上看到一篇講如何遷移SVN版本庫到Git的文章,文中有提到git svn命令,可見Git內(nèi)部已經(jīng)有了對SVN版本庫進(jìn)行操作的支持,繼而順著這個思路,試著去找找有沒有支持對VSS和CVS的操作,結(jié)果發(fā)現(xiàn)Git沒有對VSS的操作支持,對于CVS倒是有g(shù)it cvsimport,但在Git Bash中卻不認(rèn)識該命令,運(yùn)行g(shù)it help vcsimport也沒有相關(guān)的文檔,而使用git help vcs-migration倒是有文檔,其中也提到了git cvsimport,難道是我是在Windows上使用的Git(安裝的是msysGit 1.7.10),而在Windows上還不支持該命令嗎?不知道在Linux上的情況是怎么樣的?
這個問題暫時(shí)先擱置,先研究一下如何將原有的VSS版本庫遷移到Git上。
既然Git沒有對VSS的支持,那么VSS轉(zhuǎn)Git應(yīng)該是需要第三方的工具來幫助實(shí)現(xiàn)這個轉(zhuǎn)換工作(該工具要讀取并分析VSS倉庫的數(shù)據(jù),然后按照Git版本庫的內(nèi)部結(jié)構(gòu)來存放之前VSS版本庫中的數(shù)據(jù)),按照這個思路,在Google上搜索了一下,果然發(fā)現(xiàn)有一個這樣的工具,那就是vss2git,而且是個開源的項(xiàng)目,很對我的胃口。
下載下來并試用了一下,結(jié)果成功將之前的一個用VSS管理的項(xiàng)目轉(zhuǎn)換為Git倉庫,并且之前VSS的歷史信息也被保留下來,基本是滿足了要求。
VSS版本庫到Git的遷移
打開VSS2Git,其界面就是一個對話框,在其中作一些必要的設(shè)置,主要是設(shè)置VSS版本庫所在的路徑、要轉(zhuǎn)換VSS版本庫中哪一個項(xiàng)目(也可以是整個VSS版本庫中全部的項(xiàng)目)、轉(zhuǎn)換結(jié)果的存放位置、轉(zhuǎn)換Log存放的位置、轉(zhuǎn)換過程中創(chuàng)建Git提交對象時(shí)所需的email的domain等,設(shè)置好這些之后,點(diǎn)擊Go按鍵即可開始VSS到Git倉庫的轉(zhuǎn)換。

轉(zhuǎn)換所需的時(shí)間長短取決于VSS倉庫的大小,如果VSS倉庫中項(xiàng)目眾多,且開發(fā)的時(shí)間都比較久的話,那么完成整個倉庫的轉(zhuǎn)換應(yīng)該需要的時(shí)間會比較長,但如果只是轉(zhuǎn)換其中一個項(xiàng)目到Git,那么時(shí)候會比較短。
轉(zhuǎn)換后,通過git log可以看到之前VSS倉庫中的歷史信息,而且這些歷史信息在Git倉庫中仍然是按照提交時(shí)間的先后來排列的。
在轉(zhuǎn)換過程中,打開存放Git倉庫的目錄,你會發(fā)現(xiàn)工作目錄隨著時(shí)間會在變化,這是因?yàn)閂SS2Git在轉(zhuǎn)換時(shí)會先分析并收集VSS倉庫中的各種信息,然后再從VSS倉庫中記錄的最早的時(shí)間點(diǎn)開始Replay(演繹)整個VSS倉庫數(shù)據(jù)形成的過程。
在演繹過程中,應(yīng)該是先從VSS中取出最初的版本(Git倉庫最初為一個空倉庫),并將其版本中的文件作為Git工作目錄的文件,然后按照Git先對工作目錄進(jìn)行文件快照再提交到Git倉庫的做法,按照時(shí)間順序逐個版本進(jìn)行提交(提交時(shí)會取出VSS中對應(yīng)版本的歷史信息),最終將VSS版本庫轉(zhuǎn)換為Git倉庫。
上述的演繹過程是我自己初步推斷的大概過程,實(shí)際是否這么實(shí)現(xiàn),請參考VSS2Git的源代碼(用C#實(shí)現(xiàn)的)。另外,VSS倉庫內(nèi)部的數(shù)據(jù)到底是如何組織的我也沒有研究過。
要注意的幾點(diǎn):
-
如果是要將整個VSS倉庫中的所有項(xiàng)目都遷移到Git中,那么在VSS2Git界面的Project一項(xiàng)中填上$
-
如果只是要將VSS倉庫中的某一個項(xiàng)目遷移到Git上,則在Project一項(xiàng)中應(yīng)填上$/Project1(其中Project1為假設(shè)的項(xiàng)目名),甚至可以僅轉(zhuǎn)換子項(xiàng)目,這樣$/Project1/32Bit
-
VSS2Git一次要么完成VSS倉庫的整體轉(zhuǎn)換,要么只能轉(zhuǎn)換VSS倉庫中其中一個項(xiàng)目,這樣要實(shí)現(xiàn)多個項(xiàng)目的轉(zhuǎn)換就要多次執(zhí)行VSS2Git
-
VSS2Git的每一次轉(zhuǎn)換會產(chǎn)生一個Git倉庫,如果是VSS倉庫一次整體轉(zhuǎn)換,則生成的Git倉庫中將包含VSS倉庫中所有的項(xiàng)目,這樣帶來的問題是,由于Git倉庫中包含了所有的項(xiàng)目,這樣以后不同項(xiàng)目的開發(fā)人員無法從Git倉庫中只checkout出自己負(fù)責(zé)的那個項(xiàng)目文件,而是要checkout出所有項(xiàng)目的文件,這樣對于公司的代碼安全是非常不利的,那么,這樣就不應(yīng)該一次將VSS倉庫整體轉(zhuǎn)換,而是應(yīng)該以項(xiàng)目為單位進(jìn)行逐個轉(zhuǎn)換,這樣,對于不同的項(xiàng)目,對其Git倉庫就可以為不同的開發(fā)人員設(shè)置不同的操作權(quán)限
-
VSS2Git在生成Git提交信息所需的email時(shí),只是根據(jù)從VSS中提取出的User名加上在界面Email domain中填寫的內(nèi)容組合而成,實(shí)際生成的email地址未必是有效的(不一定能用來發(fā)送email)
更多的注意事項(xiàng)可至VSS2Git的主頁查看。
導(dǎo)入現(xiàn)有的Git倉庫到GitStack服務(wù)器上
通過VSS2Git,我們可以將VSS倉庫中的項(xiàng)目逐一轉(zhuǎn)換為該項(xiàng)目的Git倉庫,這時(shí)我們可以將其放置到Git服務(wù)器上了,以便后續(xù)的開發(fā)和維護(hù)。
這里,我們假設(shè)使用GitStack搭建了Git服務(wù)器(如何搭建見上篇),現(xiàn)在的問題就相當(dāng)于如何將一個現(xiàn)有的Git倉庫導(dǎo)入到GitStack搭建的服務(wù)器上。因?yàn)檎5牧鞒淌窃贕itStack上先創(chuàng)建裸倉庫,然后再向其中提交,如果這樣做的話,我們之前的VSS中的歷史信息恐怕就要丟失了,而這是我們不希望的結(jié)果。
不過幸運(yùn)的是,GitStack支持導(dǎo)入一個現(xiàn)有的Git倉庫到其中,其步驟也很簡單,就是先將現(xiàn)有的Git倉庫拷貝至C:\GitStack\repositories目錄下面,然后登陸到GitStack上,在Repositories列表中會發(fā)現(xiàn)我們的Git倉庫已經(jīng)在其中,但Action欄則出現(xiàn)了一個綠色的安裝,而非添加用戶、查看倉庫的那些按鈕,這時(shí)我們只有點(diǎn)擊這個綠色按鈕就完成了該Git倉庫的導(dǎo)入,之后我們會發(fā)現(xiàn)綠色的按鈕被正常的添加用戶、查看倉庫的那些按鈕替換掉,這時(shí)我們就可以為該Git倉庫添加用戶并設(shè)置訪問權(quán)限了。

具體的過程,在GitStack的文檔中有詳細(xì)的闡述,請見Import an existing repository,這里不再贅述。
至此,如何將VSS倉庫遷移到Git,并將生成的Git倉庫導(dǎo)入到GitStack搭建的服務(wù)器上的大概過程就結(jié)束了。
(全文完)
公司最近有意將版本控制工具從VSS和CVS切換到Git上,由于之前的項(xiàng)目一直是使用VSS和CVS進(jìn)行版本管理,這次遷移免不了要涉及VSS和CVS版本庫向Git進(jìn)行轉(zhuǎn)換的工作。
帶著這個目的,我先嘗試著找到VSS到Git遷移的可行方案,因?yàn)槲抑暗捻?xiàng)目一直也是用VSS進(jìn)行版本管理,相對于從沒有使用過的CVS而言,應(yīng)該更容易上手一些。至于CVS如何遷移到Git會在后面進(jìn)行研究。
之前在學(xué)習(xí)使用GitStack搭建Git服務(wù)器時(shí),在其官方網(wǎng)站上看到一篇講如何遷移SVN版本庫到Git的文章,文中有提到git svn命令,可見Git內(nèi)部已經(jīng)有了對SVN版本庫進(jìn)行操作的支持,繼而順著這個思路,試著去找找有沒有支持對VSS和CVS的操作,結(jié)果發(fā)現(xiàn)Git沒有對VSS的操作支持,對于CVS倒是有g(shù)it cvsimport,但在Git Bash中卻不認(rèn)識該命令,運(yùn)行g(shù)it help vcsimport也沒有相關(guān)的文檔,而使用git help vcs-migration倒是有文檔,其中也提到了git cvsimport,難道是我是在Windows上使用的Git(安裝的是msysGit 1.7.10),而在Windows上還不支持該命令嗎?不知道在Linux上的情況是怎么樣的?
這個問題暫時(shí)先擱置,先研究一下如何將原有的VSS版本庫遷移到Git上。
既然Git沒有對VSS的支持,那么VSS轉(zhuǎn)Git應(yīng)該是需要第三方的工具來幫助實(shí)現(xiàn)這個轉(zhuǎn)換工作(該工具要讀取并分析VSS倉庫的數(shù)據(jù),然后按照Git版本庫的內(nèi)部結(jié)構(gòu)來存放之前VSS版本庫中的數(shù)據(jù)),按照這個思路,在Google上搜索了一下,果然發(fā)現(xiàn)有一個這樣的工具,那就是vss2git,而且是個開源的項(xiàng)目,很對我的胃口。
下載下來并試用了一下,結(jié)果成功將之前的一個用VSS管理的項(xiàng)目轉(zhuǎn)換為Git倉庫,并且之前VSS的歷史信息也被保留下來,基本是滿足了要求。
VSS版本庫到Git的遷移
打開VSS2Git,其界面就是一個對話框,在其中作一些必要的設(shè)置,主要是設(shè)置VSS版本庫所在的路徑、要轉(zhuǎn)換VSS版本庫中哪一個項(xiàng)目(也可以是整個VSS版本庫中全部的項(xiàng)目)、轉(zhuǎn)換結(jié)果的存放位置、轉(zhuǎn)換Log存放的位置、轉(zhuǎn)換過程中創(chuàng)建Git提交對象時(shí)所需的email的domain等,設(shè)置好這些之后,點(diǎn)擊Go按鍵即可開始VSS到Git倉庫的轉(zhuǎn)換。

轉(zhuǎn)換所需的時(shí)間長短取決于VSS倉庫的大小,如果VSS倉庫中項(xiàng)目眾多,且開發(fā)的時(shí)間都比較久的話,那么完成整個倉庫的轉(zhuǎn)換應(yīng)該需要的時(shí)間會比較長,但如果只是轉(zhuǎn)換其中一個項(xiàng)目到Git,那么時(shí)候會比較短。
轉(zhuǎn)換后,通過git log可以看到之前VSS倉庫中的歷史信息,而且這些歷史信息在Git倉庫中仍然是按照提交時(shí)間的先后來排列的。
在轉(zhuǎn)換過程中,打開存放Git倉庫的目錄,你會發(fā)現(xiàn)工作目錄隨著時(shí)間會在變化,這是因?yàn)閂SS2Git在轉(zhuǎn)換時(shí)會先分析并收集VSS倉庫中的各種信息,然后再從VSS倉庫中記錄的最早的時(shí)間點(diǎn)開始Replay(演繹)整個VSS倉庫數(shù)據(jù)形成的過程。
在演繹過程中,應(yīng)該是先從VSS中取出最初的版本(Git倉庫最初為一個空倉庫),并將其版本中的文件作為Git工作目錄的文件,然后按照Git先對工作目錄進(jìn)行文件快照再提交到Git倉庫的做法,按照時(shí)間順序逐個版本進(jìn)行提交(提交時(shí)會取出VSS中對應(yīng)版本的歷史信息),最終將VSS版本庫轉(zhuǎn)換為Git倉庫。
上述的演繹過程是我自己初步推斷的大概過程,實(shí)際是否這么實(shí)現(xiàn),請參考VSS2Git的源代碼(用C#實(shí)現(xiàn)的)。另外,VSS倉庫內(nèi)部的數(shù)據(jù)到底是如何組織的我也沒有研究過。
要注意的幾點(diǎn):
-
如果是要將整個VSS倉庫中的所有項(xiàng)目都遷移到Git中,那么在VSS2Git界面的Project一項(xiàng)中填上$
-
如果只是要將VSS倉庫中的某一個項(xiàng)目遷移到Git上,則在Project一項(xiàng)中應(yīng)填上$/Project1(其中Project1為假設(shè)的項(xiàng)目名),甚至可以僅轉(zhuǎn)換子項(xiàng)目,這樣$/Project1/32Bit
-
VSS2Git一次要么完成VSS倉庫的整體轉(zhuǎn)換,要么只能轉(zhuǎn)換VSS倉庫中其中一個項(xiàng)目,這樣要實(shí)現(xiàn)多個項(xiàng)目的轉(zhuǎn)換就要多次執(zhí)行VSS2Git
-
VSS2Git的每一次轉(zhuǎn)換會產(chǎn)生一個Git倉庫,如果是VSS倉庫一次整體轉(zhuǎn)換,則生成的Git倉庫中將包含VSS倉庫中所有的項(xiàng)目,這樣帶來的問題是,由于Git倉庫中包含了所有的項(xiàng)目,這樣以后不同項(xiàng)目的開發(fā)人員無法從Git倉庫中只checkout出自己負(fù)責(zé)的那個項(xiàng)目文件,而是要checkout出所有項(xiàng)目的文件,這樣對于公司的代碼安全是非常不利的,那么,這樣就不應(yīng)該一次將VSS倉庫整體轉(zhuǎn)換,而是應(yīng)該以項(xiàng)目為單位進(jìn)行逐個轉(zhuǎn)換,這樣,對于不同的項(xiàng)目,對其Git倉庫就可以為不同的開發(fā)人員設(shè)置不同的操作權(quán)限
-
VSS2Git在生成Git提交信息所需的email時(shí),只是根據(jù)從VSS中提取出的User名加上在界面Email domain中填寫的內(nèi)容組合而成,實(shí)際生成的email地址未必是有效的(不一定能用來發(fā)送email)
更多的注意事項(xiàng)可至VSS2Git的主頁查看。
導(dǎo)入現(xiàn)有的Git倉庫到GitStack服務(wù)器上
通過VSS2Git,我們可以將VSS倉庫中的項(xiàng)目逐一轉(zhuǎn)換為該項(xiàng)目的Git倉庫,這時(shí)我們可以將其放置到Git服務(wù)器上了,以便后續(xù)的開發(fā)和維護(hù)。
這里,我們假設(shè)使用GitStack搭建了Git服務(wù)器(如何搭建見上篇),現(xiàn)在的問題就相當(dāng)于如何將一個現(xiàn)有的Git倉庫導(dǎo)入到GitStack搭建的服務(wù)器上。因?yàn)檎5牧鞒淌窃贕itStack上先創(chuàng)建裸倉庫,然后再向其中提交,如果這樣做的話,我們之前的VSS中的歷史信息恐怕就要丟失了,而這是我們不希望的結(jié)果。
不過幸運(yùn)的是,GitStack支持導(dǎo)入一個現(xiàn)有的Git倉庫到其中,其步驟也很簡單,就是先將現(xiàn)有的Git倉庫拷貝至C:\GitStack\repositories目錄下面,然后登陸到GitStack上,在Repositories列表中會發(fā)現(xiàn)我們的Git倉庫已經(jīng)在其中,但Action欄則出現(xiàn)了一個綠色的安裝,而非添加用戶、查看倉庫的那些按鈕,這時(shí)我們只有點(diǎn)擊這個綠色按鈕就完成了該Git倉庫的導(dǎo)入,之后我們會發(fā)現(xiàn)綠色的按鈕被正常的添加用戶、查看倉庫的那些按鈕替換掉,這時(shí)我們就可以為該Git倉庫添加用戶并設(shè)置訪問權(quán)限了。

具體的過程,在GitStack的文檔中有詳細(xì)的闡述,請見Import an existing repository,這里不再贅述。
至此,如何將VSS倉庫遷移到Git,并將生成的Git倉庫導(dǎo)入到GitStack搭建的服務(wù)器上的大概過程就結(jié)束了。
(全文完)