<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    李順利
    隨筆-50  評論-170  文章-0  trackbacks-0

     

     

    SVN遷移到Git的過程(+ 一些技巧)

    李順利

    Key Words

    SVNGitCloneConversionTipsVCSPro Git

     

    關于在VCSSVNGit之間的遷移(Clone)這個部分網上已經有大批的文章介紹,而且都非常不錯,能夠滿足我們的常見的需求,這里介紹的是我自己整理的一些技巧和使用中出現的一些問題和疑問。

    閱讀本篇文章,請先有一些GitSVN的使用經驗(又是經驗,經驗到底是什么?我都不知道)。

     

     

    第一部分

     

    今天的實驗對象是,把 http://code.google.com/p/jdbcdslog-exp/ 這個使用SVN管理的project遷移到 Git上面,Git托管網站選擇githubSVN遷移到Git,當然要清楚git svn 命令了。

    首先請在github上面創建一個repository,這個簡單,就不說了,然后就是使用強大的git了。

    $ git svn init https://jdbcdslog-exp.googlecode.com/svn/ -s

    $ git svn fetch

    當然上面的兩步,可以作一步處理

    $ git svn clone https://jdbcdslog-exp.googlecode.com/svn/ -s

    注: -s 參數是表面使用的是svn標準命名方法,即 trunktagsbranches,這個參數有時很重要,建議使用,命令后面還可以加個文件夾名字作為clone后的目錄,如果沒有默認是當前路徑。

    git svn fetch 這個步驟,可能碰到只想從某個版本開始進行fetch,那么請需要 –r 參數。

    例如:

    $ git svn fetch -r 1342:HEAD

    注:1342是你想要從這個版本開始fetch,如何查看這個版本號,你可以使用 svn 命令(windows下需要安裝Subversion Cliente.g. sliksvn),簡單使用就是 svn log svn_url ,這個時候,你可能看到整屏在刷新,沒關系,看到log就行。當然更簡單的就是使用TortoiseSVN-> Show log

    亦或者你可以這樣使用:

    $ git svn clone https://jdbcdslog-exp.googlecode.com/svn/ -sr 1342:HEAD jdbcdslog-exp

          到這步的時候,本地已經cloneSVN倉庫,現在需要的就是提交到遠程了。首先,關聯github遠程倉庫,如下:

    $ git remote add origin git@github.com:usc/jdbcdslog-exp.git

     

     

    普通青年這個時候,肯定就會選擇使用

    $ git push -u origin master

     

     

    github上面查看這個倉庫(repository),大致效果如下(https://github.com/usc/jdbcdslog-exp

    screenshot-20120113110127

     

    二逼青年當然要看看文檔或者倉庫信息,有沒有什么值得注意的,你瞧瞧,出現了很多branches,并沒有tagSVN倉庫目錄是標準目錄,其中tags下有幾個版本的代碼,而branches下是沒有代碼的),是不是很奇怪(上圖實際上也說明了一些問題,只有一個branches),既然出現了這樣,就要想辦法解決了。

    screenshot-20120113104705

    問題的解決直接來自《Pro Git》電子書,下面一段copy自《Pro Git》。

    【引用開始】

    你還需要一點post-import(導入后) 清理工作。最起碼的,應該清理一下git svn

    建的那些怪異的索引結構。首先要移動標簽,把它們從奇怪的遠程分支變成實際的標簽,然

    后把剩下的分支移動到本地。

    要把標簽變成合適的Git 標簽,運行

    $ cp -Rf .git/refs/remotes/tags/* .git/refs/tags/

    $ rm -Rf .git/refs/remotes/tags

     

     

     

    該命令將原本以tag/ 開頭的遠程分支的索引變成真正的(輕巧的)標簽。

    接下來,把refs/remotes 下面剩下的索引變成本地分支:

    $ cp -Rf .git/refs/remotes/* .git/refs/heads/

    $ rm -Rf .git/refs/remotes

     

     

     

    現在所有的舊分支都變成真正的Git 分支,所有的舊標簽也變成真正的Git 標簽。最后,一項工作就是把新建的Git 服務器添加為遠程服務器并且向它推送。為了讓所有的分支和標簽都得到上傳,我們使用這條命令:

    $ git push origin –all

     

     

    所有的分支和標簽現在都應該整齊干凈的躺在新的Git 服務器里了。

    【引用完畢】

     

    上面最后部分(git push origin –all),我運行發現有些問題的,并不能如它所說,分支和標簽(branches and tags)都在git服務器中,請看下面截圖:

    clip_image006[16]

    screenshot-20120113110706

    實際上,只提交了branchesgithub上面,并沒有提交tags,當然,很簡單,你可以使用 git push –h 查看下幫助,就會發現,你應該知道怎么做了,使用 git push –tags 就可以了。

    screenshot-20120113110856

    (使用git push –tags效果)

    screenshot-20120113110914

     

    為了完整,還是說說文藝青年吧。文藝青年還需要搞技術嗎?當然是找個上面的普通青年或者二逼青年就搞定了。

     

     

    第二部分

     

    到此,任務已經差不多完成了,之所以說差不多了,是因為在《Pro Git》發現了兩個更讓人遺忘的技巧。

    第一, Log中的信息(主要是作者)

    請看完成上面步驟后產生的git log,會是如何

    screenshot-20120113105115

    Pro Git》上面也有說明,需要先把作者信息抓取出來,寫到一個文件(假如是user.txt,放在git 當前目錄下)中,

    git svn clone https://jdbcdslog-exp.googlecode.com/svn/ -sr 1342:HEAD --authors-file=user.txt --no-metadata jdbcdslog

     

     

    再來看看效果

    clip_image018[16]

     

    第二,git ignores

    【下面來自《Pro Git》第八章】

    假如克隆了一個包含了svn:ignore 屬性的Subversion 倉庫,就有必要建立對應的.gitignore 文件來防止意外提交一些不應該提交的文件。git svn 有兩個有益于改善該問題的命令。第一個是git svn create-ignore,它自動建立對應的.gitignore 文件,以便下次提交的時候可以包含它。

    第二個命令是git svn show-ignore,它把需要放進.gitignore 文件中的內容打印到標

    準輸出,方便我們把輸出重定向到項目的黑名單文件:

    $ git svn show-ignore > .git/info/exclude

     

     

    這樣一來,避免了.gitignore 對項目的干擾。如果你是一個Subversion 團隊里唯一的

    Git 用戶,而其他隊友不喜歡項目包含.gitignore,該方法是你的不二之選。

    【引用結束】

     

     

    第三部分

     

    現在代碼即在SVN(google code)上面托管著,也在Git(github)上面托管著,當然提交代碼的時候,就需要注意點點。代碼的提交大致會有兩種情況,提交到SVN還是Git

    ²  提交到SVN

    開發以SVN為主,大部分Members 都使用SVN,那么如果你使用Git管理你的代碼,那么如何同步到SVN上面了?很簡單,使用下面命令就可以了,

    $ git svn rebase

    $ git svn dcommit

    原則和SVN提交差不多,先更新后提交(個人總結)

     

    ²  提交到Git

    如果想提交到Git上面,當然先要拉取SVN Repo最新的代碼,當你push的時候,你可能就會發現有些問題,

    clip_image020[16]

    根據提示,你可以很容易就知道如何處理,實際上,這也是git方便的地方,很多時候,提示 + -h 都能搞定問題。好了,整個步驟如下:

    $ git svn rebase

    $ git pull

    $ git commit –am “xxx”

    $ git push

     

     

    第四部分

     

    隨著Project的開發,可能SVN URL改變了(很多原因,比如域名改變,比如版本升級,再比如一不小心使用了http,想換到https等),那么如果使用SVN,很簡單,直接relocate就可以了,但是以前同步使用的Git Project如何跟著變化了,上網查了一下,發現比較有效的來自下面。

    https://git.wiki.kernel.org/articles/g/i/t/GitSvnSwitch_8828.html

    【引用開始】

    General Case

    What immediately sprang to mind, and what was suggested e.g. on the mailing list, was to simply edit your .git/config, and change the url= in the section [svn-remote "svn"]. That doesn't work, however. Instead, I found several suggestions to use variations of this theme:

    l  Edit the svn-remote url URL in .git/config to point to the new domain name

    l  Run git svn fetch - This needs to fetch at least one new revision from svn!

    l  Change svn-remote url back to the original url

    l  Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)

    l  Change svn-remote url back to the new url

    l  Run git svn rebase should now work again!

    This will only work, if the git svn fetch step actually fetches anything! (Took me a while to discover that... I had to put in a dummy revision to our svn repository to make it happen!)

    【引用結束】

    注:紅色部分請注意下。

    本人已經驗證這個方法是可以成功切換SVN URL的。

     

     

    如果想更了解清楚,請參考《Pro Git》第八章——Git 與其他系統。實際上這些內容,全部在《Pro Git》一書中,以前也沒仔細閱讀,現在發現,它不僅提供了基礎知識,而且還想到了我們會出現困難或者疑問的地方,并給出了解決辦法或思路。

    碰到問題再想著解決,這種“需求驅動學習”的方式是最能讓你銘記的。

     

    如果有興趣的話,后面可以介紹下,在不同的google code project中進行同步(sync)或者備份(SVN遷移到SVN)。

     

    如果你有什么問題和交流,非常歡迎通過Email(lishunli.me@gmail.com) 聯系我或者微博@李順利Me(http://weibo.com/lishunli)

         

     

    順利

    2012115

     

     

    參考

    http://progit.org/book/

    http://progit.org/book/zh/

    SVN+GIT=魚與熊掌兼得

    git svn實戰

    如何在svn系統中使用git

    小試git-svn

    https://git.wiki.kernel.org/articles/g/i/t/GitSvnSwitch_8828.html



    博客中的一些下載已經放到了百度云了,請根據需要下載。【點我去百度云下載】

    最后弱弱地說一下,如果可以的話,轉載請提供出處( ),謝謝。
    posted on 2012-01-15 19:44 李順利 閱讀(36633) 評論(2)  編輯  收藏 所屬分類: VCS

    評論:
    # re: SVN遷移到Git的過程(+ 一些技巧)[未登錄] 2014-07-09 09:12 | 小小
    啥玩意了嘛  回復  更多評論
      
    # re: SVN遷移到Git的過程(+ 一些技巧) 2015-08-28 11:23 | ohblue@qq.com
    git branch -a列出來許多tag
    但是 .git/refs/remotes/tags/ 目錄下面沒東西  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 337p欧洲亚洲大胆艺术| 国产精品亚洲综合| 永久黄网站色视频免费直播 | 色婷婷六月亚洲综合香蕉| 亚洲日本一区二区三区在线不卡| 日韩精品无码免费专区午夜不卡| 中文字幕亚洲精品资源网| 在线视频免费国产成人| 日韩免费高清播放器| 亚洲av无码专区在线电影天堂| 国产成人综合亚洲AV第一页 | 国产偷国产偷亚洲清高动态图| 99爱在线精品免费观看| 一区二区在线视频免费观看| 亚洲国产成人无码av在线播放| 亚洲精品视频在线看| 欧洲精品成人免费视频在线观看| 一级视频免费观看| 亚洲 欧洲 自拍 另类 校园| 国产亚洲真人做受在线观看| 精品免费国产一区二区| 69免费视频大片| 成人av片无码免费天天看| 亚洲乱妇熟女爽到高潮的片 | 亚洲一区二区三区播放在线| 国产精品亚洲mnbav网站| 成年女人午夜毛片免费视频| 91国内免费在线视频| 久久久久亚洲AV无码去区首| 亚洲理论片在线观看| 国产偷v国产偷v亚洲高清| 国产精品va无码免费麻豆| 在线看免费观看AV深夜影院 | 天天影视色香欲综合免费| 99在线免费视频| 十八禁的黄污污免费网站| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 亚洲综合一区二区精品久久| 中文字幕精品亚洲无线码一区 | 国产免费无遮挡精品视频| 免费毛片a在线观看67194|