文档库 最新最全的文档下载
当前位置:文档库 › ZHL的emacs笔记:版本控制

ZHL的emacs笔记:版本控制


本文档是"ZHL的emacs笔记"的一部分。

本文档的格式是为了快速检索与浏览而专门调整的,最好用emacs来查看,将tab
缩进显式设为3个字符,设置不自动换行,并使用outline模式,以提高学习和工
作效率。具体配置可参考文档"ZHL的emacs笔记:配置小技巧"。

本文档讲述的是emacs中的版本控制功能,包括git、clearcase等常用的版本控制
系统,并详细描述了配置方法以及列出了命令索引,当然,主要是本人在使用过
程中所关注的细节以及积累的经验。

希望本文档能给emacs同好一些帮助,任何问题或建议可以发信到 seaxii@https://www.wendangku.net/doc/cc4409717.html, 来讨论。

文档正文----------------------------------------------------------------

**版本控制:git、clearcase、VC辅模式。
**git:一个版本控制系统 git 的前端。 第三方的包
配置:参见"emacs配置小技巧"第78。
说明:1、该扩展由包 git.el 和 git-blame.el 提供,它们包含在 git 发行版中(contrib/emacs目录下),这里描述的是从git-1.6.4中取到的包。git中还提到一个包 vc-git.el 是用于VC辅模式的后端,它已经成为emacs的一部分(从22.2开始),留待以后研究。
2、执行 git-status 命令后进入 *git-status* 缓冲区,所有其它命令及按键绑定均在该git缓冲区中生效。
3、执行提交操作进入备注编辑模式时发现outline辅模式也被打开了,所以"完成"键绑定被覆盖了。猜测可能是由于备注编辑模式是基于text模式而其会默认打开outline辅模式而导致的。只需将该辅模式关掉,键绑定即正常了。后来该问题被彻底解决了,参见前面对"变量 text-mode-hook"的描述。
4、与正常的git工具包用法有些不同的是,在git-status缓冲区中没有将新修改提交到索引的操作(新加/删文件例外),只有直接提交的操作。但观察git.el的代码知其还是会操作索引的,只是封装隐藏起来了。
5、在 Windows+Cygwin 下配合 Cygwin 所带的 git 也能工作,但执行 git-commit-file 时由于路径映射的原因而失败(其内部直接使用了git相关命令)。
git-status :提问git工作树所在路径(子目录亦可)后进入 *git-status* 缓冲区,其默认显示与命令 git status 的输出基本一致,会列出所有有改动的文件,针对这些文件可以执行各种操作。
n 或 SPC git-next-file :光标移到下一文件。
p git-prev-file :光标移到上一文件。
f 或 RET git-find-file :在当前窗口打开当前光标所在文件。
o git-find-file-other-window :在另一窗口打开当前光标所在文件。
v git-view-file :打开view辅模式以只读方式查看当前光标所在文件。再按 q 直接退回到git缓冲区,很方便。
g git-refresh-status :手动刷新。当在emacs中改变文件时,其会自动更新。
m gi

t-mark-file :当前文件加上待操作标记。若有文件加上了待操作标记,则操作(比如比较操作)会针对所有加上了标记的文件,否则,操作只针对当前光标所在文件。
u git-unmark-file :取消当前待操作标记并光标下移。
BS git-unmark-file-up :取消当前待操作标记并光标上移。
M git-mark-all :全部加上待操作标记。
M-BS git-unmark-all :去掉全部待操作标记。
T 或 t m git-toggle-all-marks :全部翻转待操作标记。即将有标记的文件去掉标记而将没有标记的文件加上标记。
t k git-toggle-show-unknown :翻转是否显示未知文件。未知文件是指那些未加入到索引中的新文件。默认显示。
t i git-toggle-show-ignored :翻转是否显示被忽略的文件。被忽略的文件是指工作树下被 .gitignore 文件指明不被版本库追踪的文件。默认不显示。
t u git-toggle-show-uptodate :翻转是否显示未改变的文件。未改变的文件是指那些版本库中当前未作修改的文件。默认不显示。若显示了未修改文件,则相当于将版本库中所有文件都显示在git缓冲区中。
= git-diff-file :比较当前光标所在文件或所有加上了待操作标记的文件,以工作树比较HEAD,生成的patch内容显示在一个diff模式的缓冲区中,其中的子命令参见"diff模式"。
a git-add-file :将当前光标所在文件或所有加上了待操作标记的文件(必须是未知文件/新文件)加入到索引中。
r git-remove-file :删除当前光标所在文件或所有加上了待操作标记的文件。本地文件也会被删除,但在提交前可以复原。并不是从版本库中彻底删除该文件,而是做为一个版本删除之,即,若取回原先的版本则还能找回该文件。
U git-revert-file :复原当前光标所在文件或所有加上了待操作标记的文件。经实验:对于新加入到索引中的文件,会将其从索引中去除,但该文件本地内容不变,这种情况该操作是有用的;而对于已加入到版本库中且当前做了修改的文件,该操作将导致文件回到未修改状态,本地文件内容也会回复到初始状态,所以这种情况下该操作比较危险。
c git-commit-file :对当前光标所在文件或所有加上了待操作标记的文件执行提交操作,会弹出窗口进入 Log-Edit 模式等待输入备注,完后指定文件被提交进版本库而变为未改变文件。
Log-Edit 模式有以下命令:C-c 前辍的命令有可能被outline模式覆盖,参见说明3。
C-c ? log-edit-mode-help :帮助。
C-c C-f log-edit-show-files
C-c C-a log-edit-insert-changelog
C-c C-c log-edit-done :完成。
M-s vc-comment-search-forward :在以前曾输入的备注中正向查找。
M-r vc-comment-search-reverse :在以前曾输入的备注中反向查

找。
M-p vc-previous-comment :上一条以前曾输入的备注。
M-n vc-next-comment :下一条以前曾输入的备注。
C-c C-b git-branch :从当前HEAD处创建一个分支并切换到该分支上。
C-c C-o git-checkout :功能类似于git checkout命令,切换到指定分支、标签或版本。
C-c C-a git-amend-commit :取消HEAD版本,但所有本地文件(即工作树)不会改变,弹出备注窗口显示原有备注并等待修改以便再次提交或不提交(关了窗口即不提交)。并不是针对当前光标所在文件或所有加上了待操作标记的文件,而是针对一个版本(即HEAD),其行为是:回溯HEAD版本(git reset --soft HEAD^),然后将所有在该版本做了修改的文件加上待操作标记(其它文件则去掉标记),弹出备注编辑窗口并显示HEAD原有备注,可以修改备注并再次提交,也可以不提交而接着修改文件并在以后提交。
C-c C-v git-revert-commit :回复,即将指定的某个先前的版本(的前一个版本,好象是)拿过来与HEAD进行merge并准备提交以形成一个新的版本。之前必须所有文件都已提交进版本库(即没有本地修改了),否则会报错。
C-c C-p git-cherry-pick-commit :完成 git cherry-pick 命令的功能,也是取回之前的某个版本。
l git-log-file :查看当前光标所在文件或所有加上了待操作标记的文件的log。
R git-resolve-file :当merge发生冲突时,有冲突的文件会被标记为 Unmerged 状态,手工处理这些文件的冲突后用该命令结束当前光标所在文件或所有加上了待操作标记的文件的unmerged状态,然后可以接着完成提交过程。
h 或 ? git-help :帮助。
q git-status-quit :退出。
I git-insert-file
N git-next-unmerged-file
P git-prev-unmerged-file
i git-ignore-file
x git-remove-handled
d o git-diff-file-other
d m git-diff-file-mine
d h git-diff-file-merge-head
d E git-find-file-imerge
d e git-diff-file-idiff :进入 ediff 模式交互式的比较当前光标所在文件(无法操作多个文件),以工作树比较HEAD。很好的功能,是有上下文的比较,HEAD会形成在一个临时缓冲区中。
d = git-diff-file :
d c git-diff-file-combined
d b git-diff-file-base
git-blame-mode :针对当前缓冲区翻转打开Git blame辅模式。当光标上下移动时,其会在minibuffer中显示当前代码块是在何时由何人最后修改的。
**clearcase:一个版本控制系统 clearcase 的前端。 第三方的包
配置:在~/.emacs中加入如下一行即可启用该扩展。
(load "clearcase")
说明:1、该扩展由包 clearcase.el 提供。
2、该扩展生效后提供了 clearcase 辅模式,在打开版本受控的文件(或处于view上下文(view-context)中)后,辅模式名显示为:"ClearCase:.../version" ,可直接看

到该文件的版本号,菜单条中也会多出一个 ClearCase 菜单。
3、该模式的子键位映射图的名字为:clearcase-prefix-map 。
4、默认的其未单独绑定 check out 与 check in 命令,可将其如下绑定:
(define-key clearcase-prefix-map "\C-o" 'clearcase-checkout-current-buffer)
(define-key clearcase-prefix-map "\C-i" 'clearcase-checkin-current-buffer)
5、该包对 dired 模式也进行了改造,在其中可同时对多个版本化文件进行版本操作,操作命令的按键绑定与下面这些命令的相同。
6、修改几个命令的键绑定,以操作更方便的界面。
(define-key clearcase-prefix-map "b" 'clearcase-gui-vtree-browser-current-buffer)
(define-key clearcase-prefix-map "p" 'clearcase-gui-diff-pred-current-buffer)
(define-key clearcase-prefix-map "=" 'clearcase-gui-diff-branch-base-current-buffer)
(define-key clearcase-prefix-map "\C-p" 'clearcase-ediff-pred-current-buffer)
(define-key clearcase-prefix-map (kbd "C-=") 'clearcase-ediff-branch-base-current-buffer)
C-x C-q clearcase-toggle-read-only :改变当前缓冲区的只读状态,可能通过版本控制。若当前缓冲区关联的文件处于版本控制之下,则签入或签出之,否则只是翻转缓冲区的只读状态。带前导参数则表示将只是翻转缓冲区的只读状态而不管其是否是一个版本受控文件。
C-x v ~ clearcase-version-other-window :打开当前文件的指定版本。会提示输入指定版本号,默认的会给出基于当前分支的版本字符串。
C-x v ? clearcase-describe-current-buffer :描述当前版本化文件。
C-x v = clearcase-diff-pred-current-buffer :将当前版本与上一版本进行比较。
C-x v w clearcase-what-rule-current-buffer :描述是哪条规则导致取到当前版本。
C-x v v clearcase-next-action-current-buffer :做下一个合理的操作,签入签出等。
C-x v u clearcase-uncheckout-current-buffer :取消 Check Out 当前文件。
C-x v c clearcase-uncheckout-current-buffer :
C-x v m clearcase-mkbrtype :
C-x v l clearcase-list-history-current-buffer :
C-x v i clearcase-mkelem-current-buffer :
C-x v g clearcase-annotate-current-buffer :
C-x v e clearcase-edcs-edit :编辑 config spec 的内容。
C-x v b clearcase-browse-vtree-current-buffer :以 dired 模式风格显示版本树,每一屏显示当前分支下的所有子版本、标签和子分支,另有"."和".."分别表示当前分支和上级分支,操作与 dired 基本一致。
C-x v C-o clearcase-checkout-current-buffer : 我的绑定。Check Out 当前文件,但应先确定取到了正确的版本(有时须刷新一下 C-x C-v)。出现 comment 输入窗口时按 C-c C-c 即可。
C-x v C-i clearcase-checkin-current-buffer : 我的绑定。Check In 当前文件。
C-x v b clearcase-gui-vtree-browser-current-buffer :我的绑定。图形化形式

显示版本树。
C-x v p clearcase-gui-diff-pred-current-buffer :我的绑定。图形化形式将当前版本与上一版本进行比较。
C-x v = clearcase-gui-diff-branch-base-current-buffer :我的绑定。图形化形式将当前版本与当前分支基版本进行比较。
C-x v C-p clearcase-ediff-pred-current-buffer :我的绑定。以ediff模式将当前版本与上一版本进行比较。
C-x v C-= clearcase-ediff-branch-base-current-buffer :我的绑定。以ediff模式将当前版本与当前分支基版本进行比较。
**VC辅模式:(Version Control)用于emacs的版本控制系统(SCCS、RCS 和 CVS 甚至ClearCase)的前端,它隐藏了大多数的面向版本控制系统的接口细节,而用统一的操作来完成基本的版本控制操作。
说明:1、由包 vc.el 实现。
2、该模式协作于其它编辑主模式,如果打开的文件已处于版本控制之下则自动打开该模式,亦可将一个新文件注册到版本控制系统(使其被置于版本控制之下),则导致自动打开该模式。
3、版本控制的几个术语:
注册(register),即加入到版本控制系统;
签入(check in);
签出(check out);
复原(revert),即丢弃修改并放弃签出;
主控文件(master file),为版本控制系统用于保存修改记录的文件,VC依据该文件可判断打开的文件是否处于版本控制之下进而激活VC模式。
项目快照(snapshot),关联于项目所有文件的某版本(各文件之间通常会不同)的一个符号名称,用于表示软件开发项目的阶段性成果。
4、激活该模式则会在状态行的模式部分显示版本控制系统的名称和文件的修订号,如果文件还未被签出则名称和修订号之间以横线分隔,如果已签出则以冒号分隔。
5、clearcase的前端由第三方包 clearcase.el 提供,参见"emacs配置小技巧"第55。
C-x C-q vc-toggle-read-only :改变当前缓冲区的只读状态,可能通过版本控制。若当前缓冲区关联的文件处于版本控制之下,则签入或签出之,否则只是翻转缓冲区的只读状态。带前导参数表示将询问签入或签出的版本号。
C-x v v vc-next-action :为VC模式的最基本命令,其含义为:对当前文件做下一个合乎逻辑的操作,即将其带到下一个正常的版本控制状态。
C-x v i vc-register :把文件注册到版本控制系统。vc-next-action命令亦会注册文件,但它同时还签出文件,而vc-register命令则不会签出。
C-x v d vc-directory :列出某子目录下所有已注册文件并进入dired模式,之后可以对成批文件进行版本控制操作。
C-x v = vc-diff :提供对当前文件与上一版本的差异报告。加入前导命令则可以指定文件并分别指定该文件的两个用于比较的版本号(亦可以是快照名称),若给出目录名

则会提供该目录下所有已注册文件的指定版本之间的差异报告。差异报告可以通过Larry Wall开发的patch工具转换为一个补丁包。
C-x v ~ vc-version-other-window :得到指定文件的早期版本(亦可以是快照名称),文件名格式为:filename.~version~ 。
C-x v l vc-print-log :查看指定文件各版本的修改注释和修改记录。
C-x v h vc-insert-headers :给文件加上供版本控制系统使用的标题块。会在源文件中插入一个带有当前修订号、最后修改人及最后签入时间等信息的字符串,该字符串在签入、签出及复原时自动更新。
说明:1、嵌在源代码文件里的版本控制字符串能够出现在经编译得到的程序代码里,对今后的调试和升级会有帮助。
2、可以让VC根据嵌在文件里的版本控制字符串而不是根据主控文件分析该文件的版本信息,这样可以加快打开文件的速度。
3、在默认情况下Emacs不会把C文件的版本控制信息放在程序的注释中,而是保存在一个名为 vcid 的静态字符串变量中,这将使版本控制信息以字符串的形式出现在编译生成的目标文件里。
C-x v s vc-create-snapshot :创建一个项目快照并给它起个名字,则当前目录下所有已注册文件的当前版本关联于该快照名称。
C-x v r vc-retrieve-snapshot :签出一个已命名的项目快照。
C-x v a vc-update-change-log :刷新一个GNU格式的ChangeLog文件。FSF要求项目的修改注释记录于文件ChangeLog中,利用该命令可以将版本控制系统的修改注释以正确的格式追加到ChangeLog文件中而不用再输入一遍。
C-x v u vc-revert-buffer :复原,丢弃上次签入后的一切修改(签出及文件修改)。
C-x v m vc-merge :合并。
C-x v g vc-annotate :
C-x v c vc-cancel-version :丢弃一个已经保存起来的修订版。
C-x v b vc-switch-backend :
vc-rename-file :重命名版本受控文件。在版本控制系统中不推荐重命名文件,因为很麻烦还容易出错(与快照也不好协调)。
vc-clear-context :重建上下文(即与版本状态控制有关的缓存信息)。在网络环境中(NFS等)版本状态控制的开销很大,VC采用两个方法加快速度:1、缓存状态信息而不是每次都运行版本控制工具从主控文件中分析;2、从文件的写权限推导版本控制状态。当冲突(即不同步)或竞争现象(race condition)发生时,应立即使用该命令。
相关变量:
vc-handled-backends :后端(即版本控制系统)列表,决定默认使用何种版本控制系统。
vc-keep-workfiles :决定签入后是否保留本地文件(只读)。对于CVS则总是保留。
vc-mistrust-permissions :默认为nil,设为t则不根据文件权限及属主推导版本控制状态,这会大大降低VC的执行速度。
vc-consult-headers :设为t则VC

根据文件中的版本控制字符串来获取文件的状态和版本编号信息,而不再查看对应的主控文件,这将加快VC打开文件的速度,但有一定的风险。

相关文档
相关文档 最新文档