Git如何创建完整文件补丁用于下载/分发?

10

我可能有些疑惑,或者说没有人喜欢/喜欢这个功能,但很久以前我曾经使用过带有SourceForge系统的Subversion。 我能够创建提交的完整文件补丁。

我无法找到任何一种方法在Git中创建这些补丁,我只想得到从XX提交后更改的文件,并且仅获取这些文件的全部内容,以便我可以将它们交给某人/仅上传这些文件到某个位置。

目前,我陷入了重新上传整个项目的困境,因为我没有任何指示哪些部分进行了更改。由于我们还在共享Web主机上,没有办法在服务器上获取git而不升级到更昂贵的套餐。

我已经尝试过:

git archive --output=/home/username/temp.zip <commit id>

我尝试过使用压缩命令将所有内容打包到一个zip文件中,但它只是简单地把所有东西都打包了进去。另外我还尝试了一种格式化补丁的变体,但好像并没有起作用。

2个回答

18

在我的另一个答案中,我似乎误解了你的需求。git archive可以接受要包含在存档文件中的路径列表,因此您可以执行以下操作:

git archive -o /tmp/foo.zip HEAD $(git diff --name-only oldcommit HEAD)
如果您的文件名包含意外字符,那么更安全的做法是:
git diff -z --name-only oldcommit HEAD | xargs -0 git archive HEAD -o /tmp/blah.zip --

1
谢谢,这个方法很有效。在我的情况下,我需要在分支上使用它,而不是提交。所以我进行了以下操作:git diff -z --name-only origin/branch_name | xargs -0 git archive HEAD -o /tmp/blah.zip,然后通过提取存档文件到我的 repo 中应用这些更改:tar -xf /tmp/blah.zip - Surya

4

首先尝试保存git diff的输出结果,这可能已经足够解决你的问题:

git diff oldcommit > test.patch

如果您自那时以来更改了二进制文件,则可以尝试以下操作:

git diff --binary oldcommit > test-with-binaries.patch

如果是这种情况,您需要使用git apply来应用补丁。否则,我会基于oldcommit创建一个新的分支,从master进行合并,提交结果,并使用git format-patch生成补丁。该方法(以及其他解决方案)在这个类似的stackoverflow问题的答案中有更详细的描述:如何使用git format-patch将多个提交压缩成一个补丁?


那仅仅输出已更改的部分,我需要完整的文件。如果我在config.inc上更改了2行内容,我想要整个config.inc,而不仅仅是更改后的这几行。 - iarp
@iarp:啊,好的-抱歉。我添加了另一个答案,提出了一个使用“git archive”的不同建议。 - Mark Longair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接