【问题标题】:How to create and apply patch files, skipping over file versions, if needed?如果需要,如何创建和应用补丁文件,跳过文件版本?
【发布时间】:2013-11-06 20:40:50
【问题描述】:

首先,举个例子来澄清我的问题。我创建了一个名为file1 的文件,其中的数字表示文件版本。该文件只包含一行:

~$ cat file1
test1

我修改该文件,并添加包含test2 的行。我将该文件保存在新版本下,命名为file2。在该文件上调用 cat 会产生:

~$ cat file2
test1
test2

然后我进行第三次更改,再次将该文件保存在新修订版file3 下,内容如下:

~$ cat file3
test1
test2
test3

所以我的问题是:如果我想创建一个补丁,将file1 上的file3 中所做的更改应用到file1,跳过修订file2,我该怎么做?有可能吗?

基本上我需要一个更新file1内容的补丁:

~$ cat file1
test1

~$ cat file1
test1
test3

这可行吗?谢谢。

【问题讨论】:

  • 版本控制有意义吗?如果这些更改发生在代码项目中,您可以使用 git cherry-pick 之类的内容仅选择您想要包含的修订。但是,如果这些文件广泛分布在您的系统中,则可能对您的用例没有意义。
  • 您已将此标记为svn,但您正在手动通过更新文件名来跟踪修订?
  • @ThisSuitIsBlackNot 是的,为了这个例子。我虽然使用 SVN。如果我不能在本地完成这项任务,我有什么理由相信 SVN 可以完成它?

标签: linux svn unix diff patch


【解决方案1】:

你所做的看起来像是一个穷人的 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 允许您使用特定的变更集“修补”工作副本。您可以这样做以“回滚”一个或多个变更集。假设您的 repo 包含一个文件 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

在这种特殊情况下,您将遇到必须手动解决的冲突。在现实世界的存储库中,当您尝试反转较早的变更集时,您可能会也可能不会遇到冲突。

【讨论】:

  • 非常感谢您的解释!
猜你喜欢
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多