这意味着将修改后的程序作为补丁分发?
Which means distributing a modified program as patches?
我阅读了 GNU 项目中关于开源和其他许可的文章。一些许可证允许您 post 您的更改作为补丁,而不是完整的源代码(例如 Q Public 许可证或 gnuplot 许可证)。这是什么意思?这些补丁是什么样的?你能举个例子吗?
我不想关注法律情况,而是关注编程-一般定义等
patch 是参考源代码树(通常是项目的原始版本)和您的修改版本之间 diff
的结果。
通常使用 POSIX diff
命令获得。但是如今,随着 SVN、Mercurial 或 git 等版本控制工具的广泛使用,补丁通常是使用这些工具(svn diff
、hg diff
、git 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 等网站的出现,人们克隆存储库,使用他们的工具拉取最后的更改,获取差异,推送他们的更改,他们发送拉取请求通过邮件发送补丁。
我阅读了 GNU 项目中关于开源和其他许可的文章。一些许可证允许您 post 您的更改作为补丁,而不是完整的源代码(例如 Q Public 许可证或 gnuplot 许可证)。这是什么意思?这些补丁是什么样的?你能举个例子吗? 我不想关注法律情况,而是关注编程-一般定义等
patch 是参考源代码树(通常是项目的原始版本)和您的修改版本之间 diff
的结果。
通常使用 POSIX diff
命令获得。但是如今,随着 SVN、Mercurial 或 git 等版本控制工具的广泛使用,补丁通常是使用这些工具(svn diff
、hg diff
、git 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 等网站的出现,人们克隆存储库,使用他们的工具拉取最后的更改,获取差异,推送他们的更改,他们发送拉取请求通过邮件发送补丁。