2014-06-12 62 views
0

如何从选定的提交后从git存储库制作tar归档?没有第一次/初始提交的Git归档

这个问题类似于Git archive all changes except first commit但我需要.tar归档作为结果不是git补丁文件。

说明: 我为一个奇怪的PHP CMS制作了“模块”,其中没有编写扩展名的真正机制。为了发布我的模块,我只需要将修改后的文件发送给客户端,而我仍然需要在Git下创建所有CMS文件(全部仅在第一次提交时添加)。

+0

这是没有意义的。你想要存档什么?如果你只想以焦油形式获得工作目录的当前状态,那么你可以简单地使用['git archive'](http://stackoverflow.com/q/160608/456814)。如果你想从一个特定的提交后得到一组修改,你可以做一个diff,输出到一个文件,然后tar文件。 **你想做什么?** –

+0

我试图让tar档案只有自第一次提交以来发生变化的文件。 – jmarceli

+0

这还不清楚。所以你不需要diff补丁,对吗?你只需要整个文件本身?如果文件没有改变,你不介意不在tar文件中包含文件? –

回答

1

因此,这个档案的收件人没有回购,但确实有一些提交的内容,你发送的替代品,他可以解开这个?

看来git的存档的--output在Windows选项,在讲述的重定向功能,正式拒绝将压缩输出写入到它认为什么是终端的压缩机出现故障,但是这很容易地工作围绕:

git archive -o update-old-new.tgz newcommit \ 
     $(git diff --name-only --diff-filter=AM oldcommit..newcommit) | cat 

那最后是| cat是解决方法。

我忘记了archive,但使用它意味着您不必先结帐$ newcommit,这比之前的checkout;diff|tar组合好得多。

不过,这无法处理足够大的更新,以致不能处理命令行限制,或者路径名中的空格或其他恼人的字符。回退是在您的文件夹的顶层

git checkout newversion 
git diff --name-only --diff-filter=AM oldversion.. \ 
| tar Tczf - update-old-new.tgz 
+0

是的,你说得对,那是我的问题。收件人没有GIT,他们只想接收更改的文件。 – jmarceli

0

运行以下命令:

tar cvfz files-changed.tgz `git diff <newrev> <oldrev> --stat --name-only ` 

e.g

tar cvfz files-changed.tgz `git diff HEAD HEAD~3 --stat --name-only ` 
+0

如果他不在客户端尝试更新的提交上,则会归档错误的文件版本。 – jthill

+0

在这种情况下,'客户端正在尝试升级'的版本将是'newrev'。 – FractalSpace

+0

...并且打包的文件将是当前检出的任何版本,而不是newrev的版本。 – jthill