众所周知的是,vim 的代码是 Bram 用 patch 的方式维护的,一种典型的集约式管理,虽然 edyfox 在 https://vim.svn.sourceforge.net/svnroot/vim 维护了 svn 版本,但这也只是导入 CVS 的内容而已,别人无法往里面加入代码,问题是,当你想开发一系列试验性功能时,没法直接在 vim 的 svn 仓库上工作 (比如创建分支),而只能用自己的版本管理仓库。

这便造成了一个显然的维护问题,以我自己为例,vim-cocoa 的代码原本使用 code.google.com 提供的 svn 服务进行维护,但 Subversion 是以目录为单位跟踪修改的,所以,同一个代码目录,要么来自 vim 的代码仓库,要么来自 google code 的代码仓库,二者不可兼得。

所以我原来使用了一套非常麻烦的维护方式:

$ 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 的代码来,复制一份,去掉其 svn 的数据,然后将我修改过的部分导入 google code 的版本仓库。在我完成一部分修改,代码达到稳定之后,再返回 vim7 目录,更新原来用 svn 下载的代码,然后将我在 vim-cocoa/ 下做出的修改 back port 回最新的 vim7 代码里,生成针对最新版本的 patch,并编译,发布。

显然这里要花大量的时间在没有必要的手工操作上,而且很容易出错。这便是 git 该出现的时候了。再简单复述一下我的需求:

  1. 能够通过 svn 经常更新到最新的 vim 代码
  2. 自己正在工作的 vim-cocoa 分支代码不受影响
  3. 能把主干代码和分枝代码按需合并
  4. vim 的 svn 库里有些自动生成的文件,应该删除,因为 Bram 不愿意,所以我应该可以在自己的分支里删除,这样可以避免每次 commit 之前需要恢复这些自动生成的文件

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

$ mkdir vim; cd vim$ git-svn init https://vim.svn.sourceforge.net/svnroot/vim/vim7$ git-svn fetch -r 625 # 这里为了减少消耗,不复制整个 svn 版本仓库,只抓最新的 revision

这时 git-svn 会产生一个叫做 git-svn 的 remote branch,并让本地的 master 指向这个 branch。所以,我们可以从 master 分支出一个自己的版本来:

$ git checkout -b cocoa# 下面是把所有原来 vim-cocoa 做的修改在这个最新版的 vim 代码中打上$ git commit -m "import vim-cocoa changes into git repo"

此后,如果上游的 vim svn 库更新了,我们可以用 git fetch git-svn 把更新下载下来,然后,用 git merge git-svn 将这些更新 merge 到当前的 branch 里,当然,也可以用 git pull git-svn 把两步合在一起完成,只要你确定 merge 不会出现冲突。

那么,现在就有很好的一个的平台来做本地修改了,但 vim 的一个问题是,src/auto/ 中自动生成的文件也被放在 svn repo 里,这是一个很麻烦的问题,因为 vim 也不支持 off-directory build,所以在我们测试、调试过后,如果要生成 patch,就不得不先把这些 (configure/make 过程中) 必然会生成的文件先恢复到初始状态,无谓的增加了操作,如果在 git 里 commit,也会提示你这些文件更新了,但你显然不愿意把这些改动都算进你的 commit 里,那怎么让这些文件不烦人呢?

简单,我们不管上游的 vim svn 库怎么维护,可以在本地 git 仓库中把这些文件删除,也就是不跟踪的改动了:

# --cached 表示只删除 git 缓存,不删除实际文件$ 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"

因为就算这些文件不在跟踪中,一旦它们修改过了,git status 还是会提示你它们更新了,而且这样用 git commit -a 把所有修改过的文件加入下一次 commit 也不方便,怎么办呢?用 .gitignore 文件:

$ vi .gitignore

加入以下内容:

.*.swp.DS_Storesrc/TAGSsrc/tagssrc/Vimsrc/auto/*src/auto/configuresrc/auto/config.hsrc/auto/config.mksrc/auto/if_perl.csrc/auto/link.logsrc/auto/link.sedsrc/auto/osdef.hsrc/auto/pathdef.csrc/config.logsrc/config.statussrc/objectssrc/xxd/*src/Vim.app/*

这样不管这些文件怎么变,git 都不会提示了。

现在我们需要一个用来作为参考的分支,以定期生成 patch,这个分支必须随着上游 svn 的更新而更新,但我们这里删除这些自动生成文件的记录又不应该包含在内,怎么办呢?可以用 git-svn 自动生成的 master branch 来做这件事情:

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

这样,以后每次要生成一个独立的 vim-cocoa 分支相对 vim 主干的 patch 时,我都可以先在 master 分支上:

$ git-svn rebase$ git pull git-svn

然后切换回 cocoa 分支:

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

这样便完整了 patch 的生成。

最后,如果我们需要把现在这个 vim-cocoa 像原来 google code 的代码仓库一样,随时公布到网上该怎么办呢?http://repo.or.cz 提供了公开的代码仓库,申请以后可以获得一个 push 地址:

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

push 需要添加一个用户,然后上传它的 ssh 公钥 (在本地用 ssh-keygen 生成)。然后,如果我要把本地的 cocoa 分支发布到网上,就可以执行:

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

其中 cocoa 指的是来源 (本地) 分支,master 指的是目的 (远程) 分支,为什么要 push 到另一个名字的分支去呢?因为 master 是 git 默认 clone 下来的分支,为了方便其他用户的抓取,以及 gitweb 的信息显示,还是保持公开仓库里的 master 分支是你最常更新的那个分支为好。

This entry was written by jjgod and posted on November 3, 2007 at 1:00 am and filed under Mac, Programming, Tools. Bookmark the permalink. Follow any comments here with the RSS feed for this post. Post a comment or leave a trackback: Trackback URL.

用 git 维护 vim 代码相关推荐

  1. Cygwin安装GCC、G++、Python、git、vim教程

    百度百科: Cygwin是一个在windows平台上运行的类UNIX模拟环境,是cygnus solutions公司开发的自由软件(该公司开发的著名工具还有eCos,不过现已被Redhat收购).它对 ...

  2. git 和 vim 学习笔记

    在学校的时候,也断断续续的用过 git和 vim,断断续续的原因是学校的网络对 github 支持不是很好,有时候会打不开,所以,用来对代码进行版本管理就不太合适了.所以,对 git 和 vim 的命 ...

  3. 你知道如何用 Git 来统计代码吗?

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:jartto http://jartto.wang/2019/07/09/git-s ...

  4. anaconda下利用git维护github仓库

    anaconda下利用git维护github仓库 说实话,windows下利用github客户端维护github仓库是非常方便的,唯一不方便的是github客户端的下载安装,每次换电脑或重装系统都要装 ...

  5. Git - 维护项目

    Git - 维护项目 在主题分支中工作 从电子邮件应用修补程序 应用补丁与应用 应用修补程序am 签出远程分支 确定引入的内容 整合贡献的工作 合并工作流 大型合并工作流 标记您的版本 生成内部版本号 ...

  6. 使用git上传代码到github

    1.      github上创建项目 github是一个服务器托管商,我们写好的代码可以上传到github上面去 登录github的官方网站:http://github.com/ 注册一个自己的用户 ...

  7. 判断某值是否属于枚举类中的值_编写高质量可维护的代码之优化逻辑判断

    if else.switch case 是日常开发中最常见的条件判断语句,这种看似简单的语句,当遇到复杂的业务场景时,如果处理不善,就会出现大量的逻辑嵌套,可读性差并且难以扩展. 编写高质量可维护的代 ...

  8. 对于在git上面拉代码报“error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054“解决方法

    对于在git上面拉代码报"error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054"解 ...

  9. 如何编写高质量和可维护的代码

     如何编写高质量和可维护的代码 我们怎么做才能既不需要写很多注释,又能保证代码易于理解呢? 其中一个主要的方法就是让代码自文档化.其优势在于,既不用写注释,又能使得代码易于维护. 下面就是三种使得 ...

最新文章

  1. Centos7创建用户并授予sudo权限
  2. Manjaro开机黑屏卡住_显卡驱动问题解决及配置源和搜狗输入法安装。
  3. 33643分!曼巴精神永不熄,数据回顾科比20年职业生涯辉煌
  4. redis数据结构小结
  5. ActiveMQ使用线程池实现消息的生产与消费
  6. CentOS 7.3:LAMP 动静分离部署
  7. SDUT 2405 Strange Square(DFS)
  8. HLS之TS码流封装
  9. 杭电2006~2009计算机学院笔试真题详解
  10. 理解Cookie和Session的区别及使用
  11. 无限享受百度文库,财富值无视
  12. VMware安装CentOs7并配置静态IP地址
  13. 大数据实战——微博舆情大数据分析
  14. 攻防世界mfw--详细笔记
  15. RecyclerView报错:Scrapped or attached views may not be recycled
  16. Node.js之npm ERR code EPERM npm ERR syscall open npm ERR
  17. 高通QPST Download使用方法
  18. 定个可以实现的小目标
  19. 在word文档中从第3页开始编页码的方法
  20. CSS3选择器(全)

热门文章

  1. Pipeline Alpha版本项目展示
  2. js获取字符串的字节数
  3. Hibernate中的fetch
  4. 按 字节截取分别以GBK 和 utf-8 编码的 字符串的java程序。
  5. 消息中间件--RabbitMQ ---TTL队列/消息
  6. 你可能不知道的关于 Git stash 的技巧
  7. PHP webservie连接.net接口
  8. RocketMQ是怎么存储消息的?
  9. 详谈java类和对象的生命周期
  10. chatterbot mysql_ChatterBot代码解读-介绍和框架