2011-02-11 44 views
8

要么我疯了或没有人喜欢/喜欢这个功能,但很久以前我曾经用sourceforge系统使用subversion。我有能力为完成的提交创建完整的文件补丁。Git创建完整的文件补丁来下载/分发?

无论如何,我无法弄清楚在git中创建这些文件,我只想要的是从XX提交更改的文件,只有这些文件完整,以便我可以将它们交给某人/只将这些文件上传到位置。

因为它目前的立场我坚持重新上传整个项目,因为我什么都没有告诉我什么被改变。由于我们也在共享的Web主机上,因此无需升级到更昂贵的软件包就无法在服务器上获得git。

我已经试过

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

它把一切都成zip很好,但它就是这样做的,它把一切。也尝试了格式补丁的变体,但似乎没有工作。

回答

14

看来我错误地理解了我在其他答案中想要的内容。 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 -- 
+0

谢谢,这工作。在我的情况下,我需要它再次分支而不是提交。所以我做了:'git diff -z --name-only origin/branch_name | xargs -0 git archive HEAD -o/tmp/blah.zip',然后通过在我的repo中解压缩文件来应用这些更改:'tar -xf/tmp/blah.zip' – Surya

3

尝试将保存的git diff输出,这可能会在你的情况有足够的第一件事:

git diff oldcommit > test.patch 

如果自再变的二进制文件,你可以尝试:

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

在这种情况下,您需要使用git apply补丁。否则,我将创建一个基于oldcommit的新分支,从master进行压缩合并,提交结果并使用git format-patch生成补丁。该方法(以及针对您的问题的其他几种解决方案)在以下类似的计算器问题的答案中有更详细的描述:How do you squash commits into one patch with git format-patch?

+0

这仍然只输出已更改的部分,我需要整个文件。如果我在config.inc上更改了2行,我希望整个config.inc不只是更改后的行。 – iarp

+0

@iarp:啊,好的 - 对不起。我已经添加了另一个使用'git archive'代替的建议。 –