linux - 如果需要,如何创建和应用补丁文件,跳过文件版本?

标签 linux svn unix diff patch

首先,举个例子来澄清我的问题。我创建了一个名为 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/

相关文章:

c - C中的后期绑定(bind)

linux - 在 linux 下不带 -a 选项的 mail 命令更改电子邮件中的发件人字段

java - 创建 JAR 文件并在 Raspberry PI 上运行

svn - Subversion 子存储库

Bash - 压缩后丢失新行字符

python - 用合理的语言编写 UNIX shell?

linux - 同一 sed 命令上的两个模式匹配

mysql - 如何使用 cygwin 来同步文件?

svn - 如何使用Subversion一次提交多个目录?

svn - 镜像 SVN 存储库 [直写代理]