[英]How to create and apply patch files, skipping over file versions, if needed?
首先,用一个例子来澄清我的问题。 我创建了一个名为file1
,其中的数字表示文件版本。 该文件仅包含一行:
~$ cat file1
test1
我修改该文件,并添加包含test2
的行。 我将该文件保存在新修订版下,称为file2
。 在该文件上调用cat
将产生:
~$ cat file2
test1
test2
然后,我进行第三次更改,再次将该文件保存在新修订版file3
,内容如下:
~$ cat file3
test1
test2
test3
所以我的问题是这样的:如果我想创建一个补丁,以应用在file1
上对file3
所做的更改,跳过修订file2
,该怎么做? 可能吗?
基本上,我需要一个可从以下位置更新file1
内容的补丁:
~$ cat file1
test1
至
~$ cat file1
test1
test3
这可行吗? 谢谢。
您正在执行的操作看起来像一个穷人的VCS,每个文件代表一个修订版本。 两个连续文件(修订版)之间的差异表示一个变更集。 听起来您想为特定变更集创建补丁:
$ diff file2 file3 > changes.patch
并将其应用于早期版本:
$ patch file1 < changes.patch
$ cat file1
test1
test3
或者,也许您想创建一个补丁来撤销特定的变更集:
$ diff file2 file1 > changes.patch
并将其应用于您的最新修订版:
$ patch file3 < changes.patch
$ cat file3
test1
test3
对于此特定示例,如果您使用上下文或统一差异,则第一种方法将失败。 在更一般的情况下,这两种方法都不是特别可靠。 例如,如果您需要修补整个源代码树而不是单个文件,则要更新的文件的名称将从修补程序文件本身中拉出。
您应该使用真实的版本控制系统,这样就不必手动跟踪修订。 svn merge
允许您使用特定的变更集来“修补”工作副本。 您可以执行此操作以“回滚”一个或多个变更集。 假设您的回购包含一个文件file
,并且您已提交了三个修订版:
# file at r1:
test1
# file at r2:
test1
test2
# file at r3:
test1
test2
test3
您要撤消第二个变更集。 首先在r3(HEAD)检出文件:
$ svn checkout svn://path/to/repo
A repo/file
Checked out revision 3.
接下来,将变更集2中的更改(即,修订1和修订2之间进行的更改)反向合并到您的工作副本中:
$ cd repo
$ svn merge -c -2 svn://path/to/repo
在这种情况下,您将遇到冲突,必须手动解决。 在实际的存储库中,当您尝试撤消较早的变更集时,可能会或可能不会发生冲突。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.