Git中仅导出/归档已更改的文件

10
有没有一种简单的方法来从给定的提交或一系列提交中导出/归档仅更改的文件,使用git?我似乎找不到清晰的指示来做到这一点(而且我对Linux / Git还很陌生)。
我正在使用msysgit,大部分时间我都可以使用整个存储库进行部署,但在许多情况下,逐个部署少量修复文件效率更高。
在远程服务器上推送/拉取/安装git并不是一个真正的选择,因为我的访问级别因项目和客户而异。
是否有一种简单明了的方法(初步猜测):
pipe 'diff --names-only' to 'git-archive'? 
1个回答

27

我认为没有必要涉及git-archive。使用--name-only,你可以压缩文件:

tar czf new-files.tar.gz `git diff --name-only [diff options]`

由于您是Linux的新手,这可能需要一些解释:

命令行中的反引号会导致shell首先执行反引号内的命令,然后将该命令的输出替换为tar命令行中的内容。因此,先运行 git diff 命令,该命令会生成一个文件名列表(每行一个文件名)。然后将所有换行符都转换为空格,并将整个文件列表放在tar命令行中。最后,运行tar以创建指定的归档文件。请注意,这可能会生成非常长的命令行,如果有大量更改的文件,您可能需要使用不同的技术。


5
为了记录,这种不同的技术会是这样的:git diff --name-only [diff options] | xargs tar -czf files.tar.gz - jason
3
如果有过多的文件需要放置在单个命令行上,使用xargs会导致不同的问题,因为xargs会多次运行tar。这将导致tar创建一个新的.tar文件并覆盖先前的文件,因此只包含最后一批文件。 - Greg Hewgill
2
Greg,只需将tar的参数从-cvf改为-rvf即可轻松解决此问题。 - jason
3
我认为使用 "--name-only" 参数会将已删除的文件一并列出,这可能会在打包压缩或者生成空文件时导致错误。而选用 "--name-status" 参数除了列出文件名外,还会在前面加上 M,D 或 A 标识已修改、已删除或是新增,更加智能地解析这些参数将会是最优选择。 - JSchlather
2
我建议使用 git diff --diff-filter=AM […],这样只有新增修改的文件会在 git-diff 输出中列出。无需额外解析。 - Jari Keinänen
显示剩余6条评论

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