这意味着将修改后的程序作为补丁分发?

Which means distributing a modified program as patches?

我阅读了 GNU 项目中关于开源和其他许可的文章。一些许可证允许您 post 您的更改作为补丁,而不是完整的源代码(例如 Q Public 许可证或 gnuplot 许可证)。这是什么意思?这些补丁是什么样的?你能举个例子吗? 我不想关注法律情况,而是关注编程-一般定义等

patch 是参考源代码树(通常是项目的原始版本)和您的修改版本之间 diff 的结果。

通常使用 POSIX diff 命令获得。但是如今,随着 SVN、Mercurial 或 git 等版本控制工具的广泛使用,补丁通常是使用这些工具(svn diffhg diffgit diff 等生成的。 )

在接收端,通常使用 POSIX patch 命令应用补丁。

这是一个例子。假设您正在处理一个项目(下面的 orig_version 目录)。在进行任何更改之前,您明智地创建它的副本(下面的 my_version 目录)并从副本修改文件:

cp -a orig_version my_version

# Change "This is the original version"
# ... to "This is my modified version"
$ vi my_version/README.txt

让我们看看区别:

$ diff -ruN orig_version my_version
diff -ruN orig_version/README.txt my_version/README.txt
--- orig_version/README.txt 2021-02-16 10:53:05.303423169 +0100
+++ my_version/README.txt   2021-02-16 10:53:00.243495007 +0100
@@ -1 +1 @@
-This is the original version
+This is my modified version

# Rredirect this output so as to
# create a patch file we can send
$ diff -ruN orig_version my_version > /tmp/my.patch

上面的输出显示了两个目录树之间的差异。我们已将差异放在一个文件中,稍后我们可以将其发送(例如通过邮件)给其他人,然后他们将能够查看更改并通过 patch:

应用它们
# First we create a copy of our project
$ cp -a orig_version test_version

$ cd test_version

$ cat README.txt 
This is the original version

# Then we apply the patch
$ patch -p1 < /tmp/my.patch
patching file README.txt

# Let's see the result
$ cat README.txt 
This is my modified version

注意:因为我们在 test_version 目录中,所以我们使用了 -p1 选项,以便 patch 忽略在 [= 的输出中找到的文件路径的第一个元素13=](--- orig_version/README.txt 变为 --- README.txt,与 +++ 行相同)。

25 年前,人们过去常常通过邮件发送和接收补丁,并像我刚才展示的那样应用它们。今天,随着分布式版本控制系统和 Bitbucket 和 Github 等网站的出现,人们克隆存储库,使用他们的工具拉取最后的更改,获取差异,推送他们的更改,他们发送拉取请求通过邮件发送补丁。