我该如何在vim中进行“版本控制”?

6
例如,我有一个可用的代码,但速度不够快,所以我想记录下这个版本的代码并继续优化它,也许会得到更好的版本,然后再次记录这个版本,如此往复。
如果最终我无法得到一个快速的代码,我想回滚到原始的可用代码。
我猜这可以通过使用撤销分支来实现,但我没有找到如何做到这一点。

8
你是否考虑过使用适合工作的正确工具——版本控制系统?例如Subversion、Git或Mercurial,它们都可以通过一行命令(非常短的一行命令)进行设置和使用。 - thiton
1
@thiton,为每个你在系统上编写或编辑的文本文件设置一个真正的版本控制系统并不是很实际的,此外你还需要管理它。这当然是正确的做法,但是在vim中拥有更强大的撤销历史记录对于那些版本控制过度的情况来说是非常好的。 - HaskellElephant
@HaskellElephant 把这些文件放在一个单一的代码库中并不是问题,因为大多数(我所知道的全部)版本控制系统都有能力只显示修改了特定路径的提交记录。 - ZyX
@ZyX 你真的把 /* 放进了 Git 仓库吗?我不建议这样做。 - kiltek
@kiltek 这个问题涉及到代码,那么根目录与之相关吗?我已经为我要维护超过几分钟的任何类型的代码设置了VCS存储库。通常是单独的存储库,但“一个VCS存储库用于一组小型不相关脚本”的概念对我来说并不陌生。版本控制很少会对文本文件集合造成过多负担。 - ZyX
5个回答

7

使用版本控制系统。我推荐使用GitFugitive插件。

认真对待这个建议!

你不会后悔的。


6

是的,您可以添加撤销分支功能,使其更像版本控制系统。

在vim 7.3中,您可以拥有持久的撤销功能,如此处所述,您只需要将以下行添加到您的.vimrc文件中即可。

set undodir=~/.vim/undodir
set undofile

为了充分利用撤销分支,我强烈推荐使用gundo,因为您可以使用它来可视化树形结构并查看提交的差异。

3

使用版本控制系统对任何你所工作的项目来说都是一个好主意,即使它们非常小。即便如此,HaskellElephant提出了一个好点子——偶尔,你可能会尝试调整一些小脚本。在这种情况下,能够创建保存点可能是相当酷的事情,所以我尝试运用vim的undotree()函数,并编写了以下脚本:

command! -nargs=1 StoreUndo call s:StoreUndo(<f-args>)
function! s:StoreUndo(label)
  if !exists('b:stored_undo_state')
    let b:stored_undo_state = {}
  endif

  let b:stored_undo_state[a:label] = undotree()['seq_cur']
endfunction

command! -nargs=1 -complete=custom,s:CompleteUndoStates RestoreUndo call s:RestoreUndo(<f-args>)
function! s:RestoreUndo(label)
  if !exists('b:stored_undo_state')
    let b:stored_undo_state = {}
  endif

  if !has_key(b:stored_undo_state, a:label)
    echoerr a:label.' not found in stored undo states.'
  endif

  exe 'undo '.b:stored_undo_state[a:label]
endfunction

function! s:CompleteUndoStates(A, L, P)
  if !exists('b:stored_undo_state')
    let b:stored_undo_state = {}
  endif

  return join(keys(b:stored_undo_state), "\n")
endfunction

这是摘要形式:https://gist.github.com/1473170 你可以将它放在~/.vim/plugin下。执行命令:StoreUndo foo将创建一个名为“foo”的保存点。您可以进行任何更改。当您执行:RestoreUndo foo时,缓冲区将恢复保存的状态。所有现有保存点都可以通过RestoreUndo命令进行选项卡完成。
这不会被持久化到文件中。如果关闭缓冲区,则会丢失历史记录,因此这只能在短时间内进行快速实验时有用。

2

0

我对vim并不是很熟练(事实上,我几乎不会用它),但我想到的解决方案有:

  • 使用实际的版本控制,这就是它的作用。甚至可以使用其中一种“分布式”版本控制,因为它们不需要单独的存储库;
  • 当您需要时,只需备份文件/文件夹的副本。
  • 您甚至可以编写一个简短的程序(shell脚本?),为您复制带有自动添加后缀的文件/文件夹,该后缀标记了您进行复制的时间。
  • ...然后将该程序绑定到vim快捷方式上(不知道如何做到这一点,但据说vim非常强大,我想它应该有这样的功能)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接