亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

用 git 維護(hù) vim 代碼

系統(tǒng) 2180 0


眾所周知的是,vim 的代碼是 Bram 用 patch 的方式維護(hù)的,一種典型的集約式管理,雖然 edyfox 在 https://vim.svn.sourceforge.net/svnroot/vim 維護(hù)了 svn 版本,但這也只是導(dǎo)入 CVS 的內(nèi)容而已,別人無法往里面加入代碼,問題是,當(dāng)你想開發(fā)一系列試驗(yàn)性功能時(shí),沒法直接在 vim 的 svn 倉庫上工作 (比如創(chuàng)建分支),而只能用自己的版本管理倉庫。

這便造成了一個(gè)顯然的維護(hù)問題,以我自己為例,vim-cocoa 的代碼原本使用 code.google.com 提供的 svn 服務(wù)進(jìn)行維護(hù),但 Subversion 是以目錄為單位跟蹤修改的,所以,同一個(gè)代碼目錄,要么來自 vim 的代碼倉庫,要么來自 google code 的代碼倉庫,二者不可兼得。

所以我原來使用了一套非常麻煩的維護(hù)方式:

        
          $ svn co https://vim.svn.sourceforge.net/svnroot/vim/vim7
          
$ cp -r vim7/ vim-cocoa/
$ cd vim-cocoa; find . -name ".svn/*" -exec rm -rf {};
$ svn import src/gui_mac.m https://vim-cocoa.googlecode.com/gui_mac.m
...

也就是說,抓下一份 vim 的代碼來,復(fù)制一份,去掉其 svn 的數(shù)據(jù),然后將我修改過的部分導(dǎo)入 google code 的版本倉庫。在我完成一部分修改,代碼達(dá)到穩(wěn)定之后,再返回 vim7 目錄,更新原來用 svn 下載的代碼,然后將我在 vim-cocoa/ 下做出的修改 back port 回最新的 vim7 代碼里,生成針對(duì)最新版本的 patch,并編譯,發(fā)布。

顯然這里要花大量的時(shí)間在沒有必要的手工操作上,而且很容易出錯(cuò)。這便是 git 該出現(xiàn)的時(shí)候了。再簡單復(fù)述一下我的需求:

  1. 能夠通過 svn 經(jīng)常更新到最新的 vim 代碼
  2. 自己正在工作的 vim-cocoa 分支代碼不受影響
  3. 能把主干代碼和分枝代碼按需合并
  4. vim 的 svn 庫里有些自動(dòng)生成的文件,應(yīng)該刪除,因?yàn)?Bram 不愿意,所以我應(yīng)該可以在自己的分支里刪除,這樣可以避免每次 commit 之前需要恢復(fù)這些自動(dòng)生成的文件

下面是用 git 完成的步驟,主要就是利用了 git-svn 這套方便的工具:

        
          $ mkdir vim; cd vim
          
$ git-svn init https://vim.svn.sourceforge.net/svnroot/vim/vim7
$ git-svn fetch -r 625 # 這里為了減少消耗,不復(fù)制整個(gè) svn 版本倉庫,只抓最新的 revision

這時(shí) git-svn 會(huì)產(chǎn)生一個(gè)叫做 git-svn 的 remote branch,并讓本地的 master 指向這個(gè) branch。所以,我們可以從 master 分支出一個(gè)自己的版本來:

        
          $ git checkout -b cocoa
          
# 下面是把所有原來 vim-cocoa 做的修改在這個(gè)最新版的 vim 代碼中打上
$ git commit -m "import vim-cocoa changes into git repo"

此后,如果上游的 vim svn 庫更新了,我們可以用 git fetch git-svn 把更新下載下來,然后,用 git merge git-svn 將這些更新 merge 到當(dāng)前的 branch 里,當(dāng)然,也可以用 git pull git-svn 把兩步合在一起完成,只要你確定 merge 不會(huì)出現(xiàn)沖突。

那么,現(xiàn)在就有很好的一個(gè)的平臺(tái)來做本地修改了,但 vim 的一個(gè)問題是,src/auto/ 中自動(dòng)生成的文件也被放在 svn repo 里,這是一個(gè)很麻煩的問題,因?yàn)?vim 也不支持 off-directory build,所以在我們測試、調(diào)試過后,如果要生成 patch,就不得不先把這些 (configure/make 過程中) 必然會(huì)生成的文件先恢復(fù)到初始狀態(tài),無謂的增加了操作,如果在 git 里 commit,也會(huì)提示你這些文件更新了,但你顯然不愿意把這些改動(dòng)都算進(jìn)你的 commit 里,那怎么讓這些文件不煩人呢?

簡單,我們不管上游的 vim svn 庫怎么維護(hù),可以在本地 git 倉庫中把這些文件刪除,也就是不跟蹤的改動(dòng)了:

        
          # --cached 表示只刪除 git 緩存,不刪除實(shí)際文件
          
$ git rm --cached src/auto/config.h
$ git rm --cached src/auto/config.mk
$ git rm --cached src/auto/configure
...
$ git commit -m "stop tracking auto generated files"

因?yàn)榫退氵@些文件不在跟蹤中,一旦它們修改過了,git status 還是會(huì)提示你它們更新了,而且這樣用 git commit -a 把所有修改過的文件加入下一次 commit 也不方便,怎么辦呢?用 .gitignore 文件:

        
          $ vi .gitignore
          

加入以下內(nèi)容:

        
          .*.swp
          
.DS_Store
src/TAGS
src/tags
src/Vim
src/auto/*
src/auto/configure
src/auto/config.h
src/auto/config.mk
src/auto/if_perl.c
src/auto/link.log
src/auto/link.sed
src/auto/osdef.h
src/auto/pathdef.c
src/config.log
src/config.status
src/objects
src/xxd/*
src/Vim.app/*

這樣不管這些文件怎么變,git 都不會(huì)提示了。

現(xiàn)在我們需要一個(gè)用來作為參考的分支,以定期生成 patch,這個(gè)分支必須隨著上游 svn 的更新而更新,但我們這里刪除這些自動(dòng)生成文件的記錄又不應(yīng)該包含在內(nèi),怎么辦呢?可以用 git-svn 自動(dòng)生成的 master branch 來做這件事情:

        
          $ git checkout master
          
$ git rm --cached src/auto/config.h
...
$ git commit -m "blahblahblah"

這樣,以后每次要生成一個(gè)獨(dú)立的 vim-cocoa 分支相對(duì) vim 主干的 patch 時(shí),我都可以先在 master 分支上:

        
          $ git-svn rebase
          
$ git pull git-svn

然后切換回 cocoa 分支:

        
          $ git checkout cocoa
          
$ git diff master > vim-cocoa.patch

這樣便完整了 patch 的生成。

最后,如果我們需要把現(xiàn)在這個(gè) vim-cocoa 像原來 google code 的代碼倉庫一樣,隨時(shí)公布到網(wǎng)上該怎么辦呢?http://repo.or.cz 提供了公開的代碼倉庫,申請(qǐng)以后可以獲得一個(gè) push 地址:

        
          git+ssh://repo.or.cz/srv/git/vim-cocoa.git
          

push 需要添加一個(gè)用戶,然后上傳它的 ssh 公鑰 (在本地用 ssh-keygen 生成)。然后,如果我要把本地的 cocoa 分支發(fā)布到網(wǎng)上,就可以執(zhí)行:

        
          $ git push git+ssh://repo.or.cz/srv/git/vim-cocoa.git cocoa:master
          

其中 cocoa 指的是來源 (本地) 分支,master 指的是目的 (遠(yuǎn)程) 分支,為什么要 push 到另一個(gè)名字的分支去呢?因?yàn)?master 是 git 默認(rèn) clone 下來的分支,為了方便其他用戶的抓取,以及 gitweb 的信息顯示,還是保持公開倉庫里的 master 分支是你最常更新的那個(gè)分支為好。

用 git 維護(hù) vim 代碼


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 狠狠色噜噜狠狠狠狠五月婷 | 精品免费国产一区二区三区 | 欧美一区二区三区在观看 | 欧美成人手机在线视频 | 91视频毛片 | 日韩精品成人a在线观看 | 亚洲精品区在线播放一区二区 | 亚洲狠狠婷婷综合久久久久网站 | 国产我不卡 | h视频国产 | 欧美色视频在线观看 | 久久线看观看精品香蕉国产 | 久青草视频在线 | 久久草视频在线 | 国产最新精品 | 日韩亚射 | 亚洲一级毛片视频 | 欧美一级毛片日本 | 亚洲综合精品一二三区在线 | 97久久综合精品久久久综合 | 国内精品久久久久影院网站 | 国产亚洲综合精品一区二区三区 | 看免费黄色一级视频 | 免费观看成人毛片 | 日本免费新一区二区三区 | 一区二区中文字幕在线观看 | 特级毛片s级全部免费 | 嘿咻成人免费视频欧美激情 | 国产麻豆精品手机在线观看 | 日本久久网| 爱操综合| 欧美xxxxx九色视频免费观看 | 久久精品国产精品亚洲精品 | 欧美xxxxx性另类 | 伊人久久大香线蕉亚洲 | 亚洲精品一区二区三区五区 | 亚洲精品久久久久影 | 目韩一区二区三区系列片丶 | 欧美一区二区三 | 国外成人在线视频 | 日本人一级毛片免费视频 |