首先,举个例子来澄清我的问题。我创建了一个名为 file1
的文件,其中数字表示文件修订版。该文件仅包含一行:
~$ cat file1
test1
我修改了那个文件,并添加了一行包含test2
。我将该文件保存在新修订版下,将其命名为 file2
。对该文件调用 cat
会产生:
~$ cat file2
test1
test2
然后我进行第三次更改,再次将该文件保存在新版本 file3
下,内容为:
~$ cat file3
test1
test2
test3
所以我的问题是:如果我想创建一个补丁,将 file3
中所做的更改应用于 file1
,跳过修订版 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
在这种特殊情况下,您将遇到必须手动解决的冲突。在现实世界的存储库中,当您尝试撤消较早的变更集时,您可能会或可能不会发生冲突。
关于linux - 如果需要,如何创建和应用补丁文件,跳过文件版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19822362/