【问题标题】:Zip latest committed changes only仅压缩最新提交的更改
【发布时间】:2011-03-26 07:27:42
【问题描述】:

Git 有一个非常方便的 archive 命令,它允许我在 .zip 存档中制作特定提交的副本,如下所示:

git archive -o ../latest.zip some-commit

这将包含该提交的整个工作树。通常我只需要自上一个版本以来更改的文件。目前我使用它来将这些文件放入一个 zip 文件中:

git diff --name-only previous-commit latest-commit | zip ../changes.zip -@

然而,这将从我的工作副本中压缩文件,这些文件可能有未提交的更改。有什么方法可以只获取直接提交到 zip 中的更改文件?

【问题讨论】:

    标签: git bash


    【解决方案1】:

    我想出了一个解决方案,一行很简单:

    zip archive.zip $(git diff-tree --no-commit-id --name-only -r latest-commit)
    

    您也可以通过此方法使用任何其他归档方法,例如 tar。

    【讨论】:

      【解决方案2】:

      为了实现一些有用的东西来为我解决这样的问题,我实现了一个简单的 bash 脚本。该脚本采用修订哈希并创建一个 tar.gz 存档,其中包含所有更改的文件,包括目录层次结构。 任何人都可以使用或修改它,如果它对某人有帮助,我会很高兴。

      只需在 git 存储库的根目录中运行脚本并将修订哈希传递给命令行参数。

      Link to the script on hithub

      【讨论】:

      • 示例如下所示:#./do_delivery.sh -r a5ab48cdbb -n "vmeagt_delivery" ===> 存档文件名:"vmeagt_delivery-20120430" ===> 受影响的修订:"a5ab48cdbb- ->HE​​AD" ===> 输出路径:"/Users/crible/Projects/ServerView_Agents/" ===> Git 存储库:"/Users/crible/Projects/ServerView_Agents/" ===> 创建 tar.gz 存档。 .. ===> 完成!
      • 这只是第一个版本,强烈需要改进:)
      【解决方案3】:

      git archive 将接受路径作为参数。您需要做的就是:

      git archive -o ../latest.zip some-commit $(git diff --name-only earlier-commit some-commit)
      

      或者如果您的文件中有空格(或其他特殊字符),请使用 xargs:

      git diff --name-only earlier-commit some-commit | xargs -d'\n' git archive -o ../latest.zip some-commit
      

      如果您没有正确安装 xargs,您可以制作一个替代方案:

      #!/bin/bash
      
      IFS=$'\n'
      files=($(git diff --name-only earlier-commit some-commit))
      
      git archive -o ../latest.zip some-commit "${files[@]}"
      

      编写为 shell 脚本,但也应作为单行脚本。或者,将 earlier-commitsome-commit../latest.zip 更改为 $1 $2$3,您就拥有了一个可重用的脚本。

      【讨论】:

      • 请注意,提取此类存档不会删除任何文件。这可能会导致以后难以诊断问题。
      • @jilles:非常正确。这就是为什么补丁很棒。 @Marnix van Valen:您也许可以只生成补丁,然后用脚本包装它(您甚至可以使用heredoc 将其全部保存在一个文件中)-然后它既可用又正确。
      • 我通常会在发行版中包含所有添加和删除文件的列表。然后,客户将手动将文件添加到源控制/从源控制中删除。 @Jefromi 好主意。这将完全消除任何人为错误。我试试看。
      • @Jefromi 第二个命令有一个问题;它在 Windows 上不起作用。 Windows git 安装程序附带的 xargs 版本不支持 -d 选项。我也找不到任何其他用于 Windows 的 xargs 构建。有什么想法可以替代吗?
      • @Marnix van Valen:然后我会在 bash 中完成。查看答案。
      【解决方案4】:

      如果创建补丁不是一个选项,那么这样的事情怎么样:

      git stash
      git checkout latest-commit
      git diff --name-only previous-commit | zip ../changes.zip -@
      git checkout master
      git stash apply
      

      注意:git stashgit stash apply 仅在您有尚未提交的工作副本更改时才需要。

      注意 2:git checkout latest-commit 会让你处于超然状态。完成后请务必git checkout master,否则您可能会在以后的提交中遇到问题。

      【讨论】:

      • @Marnix van Valen 那么为什么不把它变成一个简单的脚本(或批处理文件)呢?问题是您需要将文件名列表翻译成特定版本。我能想到的唯一其他方法是使用git show latest-commit:file。但是,我无法想出一个班轮来做到这一点。它看起来像这样:git diff --name-only previous-commit | xargs -I file git show latest-commit:file ...但问题就在这里。这会将文件(没有名称)打印到 STDOUT。如何将其翻译成 zip 文件?
      【解决方案5】:

      为什么不创建一个 git 补丁,然后将其应用到其他代码库?

      $ git format-patch HEAD^..HEAD
      

      【讨论】:

      • 恐怕不是每个人都知道如何使用补丁文件。我用它来向我的客户提供新版本。即使是非开发人员也可以解压缩档案。应用补丁需要的技能并非我的所有客户都掌握(甚至想掌握)。
      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2021-04-30
      相关资源
      最近更新 更多