用 git 维护 vim 代码
众所周知的是,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 该出现的时候了。再简单复述一下我的需求:
- 能够通过 svn 经常更新到最新的 vim 代码
- 自己正在工作的 vim-cocoa 分支代码不受影响
- 能把主干代码和分枝代码按需合并
- 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 分支是你最常更新的那个分支为好。
用 git 维护 vim 代码相关推荐
- Cygwin安装GCC、G++、Python、git、vim教程
百度百科: Cygwin是一个在windows平台上运行的类UNIX模拟环境,是cygnus solutions公司开发的自由软件(该公司开发的著名工具还有eCos,不过现已被Redhat收购).它对 ...
- git 和 vim 学习笔记
在学校的时候,也断断续续的用过 git和 vim,断断续续的原因是学校的网络对 github 支持不是很好,有时候会打不开,所以,用来对代码进行版本管理就不太合适了.所以,对 git 和 vim 的命 ...
- 你知道如何用 Git 来统计代码吗?
点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:jartto http://jartto.wang/2019/07/09/git-s ...
- anaconda下利用git维护github仓库
anaconda下利用git维护github仓库 说实话,windows下利用github客户端维护github仓库是非常方便的,唯一不方便的是github客户端的下载安装,每次换电脑或重装系统都要装 ...
- Git - 维护项目
Git - 维护项目 在主题分支中工作 从电子邮件应用修补程序 应用补丁与应用 应用修补程序am 签出远程分支 确定引入的内容 整合贡献的工作 合并工作流 大型合并工作流 标记您的版本 生成内部版本号 ...
- 使用git上传代码到github
1. github上创建项目 github是一个服务器托管商,我们写好的代码可以上传到github上面去 登录github的官方网站:http://github.com/ 注册一个自己的用户 ...
- 判断某值是否属于枚举类中的值_编写高质量可维护的代码之优化逻辑判断
if else.switch case 是日常开发中最常见的条件判断语句,这种看似简单的语句,当遇到复杂的业务场景时,如果处理不善,就会出现大量的逻辑嵌套,可读性差并且难以扩展. 编写高质量可维护的代 ...
- 对于在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"解 ...
- 如何编写高质量和可维护的代码
如何编写高质量和可维护的代码 我们怎么做才能既不需要写很多注释,又能保证代码易于理解呢? 其中一个主要的方法就是让代码自文档化.其优势在于,既不用写注释,又能使得代码易于维护. 下面就是三种使得 ...
最新文章
- Centos7创建用户并授予sudo权限
- Manjaro开机黑屏卡住_显卡驱动问题解决及配置源和搜狗输入法安装。
- 33643分!曼巴精神永不熄,数据回顾科比20年职业生涯辉煌
- redis数据结构小结
- ActiveMQ使用线程池实现消息的生产与消费
- CentOS 7.3:LAMP 动静分离部署
- SDUT 2405 Strange Square(DFS)
- HLS之TS码流封装
- 杭电2006~2009计算机学院笔试真题详解
- 理解Cookie和Session的区别及使用
- 无限享受百度文库,财富值无视
- VMware安装CentOs7并配置静态IP地址
- 大数据实战——微博舆情大数据分析
- 攻防世界mfw--详细笔记
- RecyclerView报错:Scrapped or attached views may not be recycled
- Node.js之npm ERR code EPERM npm ERR syscall open npm ERR
- 高通QPST Download使用方法
- 定个可以实现的小目标
- 在word文档中从第3页开始编页码的方法
- CSS3选择器(全)