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

AKS*_*AKS 10 git export archive msysgit

有没有一种简单的方法可以从git中的给定提交或一系列提交中仅导出/存档已更改的文件?我似乎无法找到明确的指示(我是Linux/Git的新手).

我正在使用msysgit,并且在大多数情况下我可以部署整个存储库,但在许多情况下,一次部署一些文件的小修补程序要高效得多.

在远程服务器上推/拉/安装git实际上并不是一个选项,因为我的访问级别因项目和客户端而异.

是否有一种直接的方式(粗略猜测):

pipe 'diff --names-only' to 'git-archive'? 
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 26

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

tar czf new-files.tar.gz `git diff --name-only [diff options]`
Run Code Online (Sandbox Code Playgroud)

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

命令行中的反引号使shell首先在反引号中执行命令,然后将该命令的输出替换为命令行tar.因此git diff首先运行,它生成一个文件名列表,每行一个.新tar行将折叠为空格,整个文件列表将放在命令行中.然后tar运行以创建给定的存档.请注意,这可能会生成很长的命令行,因此如果您有大量已更改的文件,则可能需要使用不同的技术.

  • 为了后人的缘故,这种不同的技术就像:`git diff --name-only [diff options] | xargs tar -czf files.tar.gz` (4认同)
  • 使用`xargs`,你有一个不同的问题,因为如果有太多文件将它们全部放在一个命令行上,`xargs`将多次运行`tar`.这将导致`tar`创建一个覆盖前一个.tar文件的新.tar文件,因此它只包含最后一批文件. (2认同)
  • Greg,这可以通过使用 `-rvf` 而不是 `-cvf` 作为 `tar` 的参数轻松解决。 (2认同)
  • 我相信--name-only也会为你提供已被删除的文件.在zip中压缩或清空文件时可能会导致错误.除了在前面添加M,D或A之外,选项--name-status将与--name-only相同.使用这个想法的一些更聪明的解析可能是最佳的. (2认同)
  • 我建议使用 `git diff --diff-filter=AM [...]`,这样 git-diff 输出中只会列出 **a**dded 或 **m**odified 文件。不需要额外的解析。 (2认同)