【问题标题】:Git. How to create archive with files, that have been changed?吉特。如何使用已更改的文件创建存档?
【发布时间】:2018-12-09 16:32:41
【问题描述】:

保持文件结构,如git-archive

【问题讨论】:

  • 是的。两次提交之间
  • 哪个提交的内容应该进入归档文件?
  • 所有文件内容,如命令“git archive -o update.zip”所做的

标签: git


【解决方案1】:

git archive 将文件路径作为参数,因此您可以执行以下操作:

git diff --name-status commit1 commit2 | awk '{ if ($1 != "D") print $2 }' | xargs git archive -o output.zip HEAD

更新

如果您的文件名包含空格,则以下内容将起作用:

git diff --name-status commit1 commit2 | awk '{ if ($1 != "D") printf("\"%s\"\n", substr($0,3)) }' | xargs git archive -o output.zip HEAD --

注意:存档中包含的文件的内容是它在 HEAD 中的内容。要使用来自其他提交的内容,只需将此命令末尾的 HEAD 更改为您想要的任何内容。

【讨论】:

  • 我一直在打一场失败的战斗,试图弄清楚如果某些文件名包含空格,如何使它工作。你有什么建议吗?
  • @Neville 试试git diff --name-status commit1 commit2 | awk '{ if ($1 != "D") printf("\"%s\"\n", substr($0,3)) }' | xargs git archive -o output.zip HEAD --
  • 很酷,但请记住,如果您的文件名包含双引号或换行符,这将不起作用(更多信息,请阅读 dwheeler.com/essays/fixing-unix-linux-filenames.html
【解决方案2】:

这是在提交标记 releaseHEAD 之间存档更改的命令,也适用于包含空格、引号、双引号和任何特殊字符的文件名:

git diff --name-only -z --diff-filter=ACMRT release..HEAD | xargs -0 git archive -o update.tar.gz HEAD --

【讨论】:

    【解决方案3】:

    感谢@Charles Duffy https://stackoverflow.com/users/14122/charles-duffy

    感谢@Viperet 的回答。如果您有很长的要归档的文件列表,下面是插入暂停。 Xargs 将使用拆分参数多次运行相同的命令,因此它将始终生成带有最后一个拆分参数的存档 zip。为了纠正这个问题,一个快速的解决方法是在两者之间插入一个暂停。

    再次感谢 Charles Duffy。 XARGS Long Arguments and Pause Between Commands

    更新命令:

    git diff --name-only -z --diff-filter=ACMRT release..HEAD | xargs -0 bash -c '"$@"; sleep 10' _ git archive -o update.tar.gz HEAD
    

    希望它也对其他人有所帮助。

    谢谢,

    哈杰

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-29
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 2018-06-22
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多