代码之家  ›  专栏  ›  技术社区  ›  Marnix van Valen

仅压缩最新提交的更改

  •  21
  • Marnix van Valen  · 技术社区  · 14 年前

    Git有非常方便的 archive 命令,该命令允许我在.zip存档中创建特定提交的副本,如下所示:

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

    这将包含该提交的整个工作树。通常我只需要从上一版本开始更改的文件。目前,我使用此命令将这些文件放入zip:

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

    但是,这将压缩我的工作副本中的文件,其中可能有未提交的更改。有没有什么方法可以只获取更改后的文件,因为它们被直接提交到zip中?

    5 回复  |  直到 14 年前
        1
  •  44
  •   Cascabel    14 年前

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

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

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

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

    作为shell脚本编写,但也应该作为一行程序。或者,改变 earlier-commit , some-commit ,和 ../latest.zip $1 $2 $3 你有一个可重用的脚本。

        2
  •  4
  •   Tim Henigan    14 年前

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

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

    git stash git stash apply 仅当您有尚未提交的工作副本更改时才需要。

    注2: git checkout latest-commit 会让你变得超然。一定要去 git checkout master

        3
  •  2
  •   user987266 user987266    13 年前

    任何人都可以使用它或修改,我会很高兴,如果它能帮助别人。

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

    Link to the script on hithub

        4
  •  1
  •   Denis Chevalier    8 年前

    我想出了一个解决方案,一句话,非常简单:

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

    您也可以将任何其他归档方法(如tar)与此方法一起使用。

        5
  •  -1
  •   knittl    14 年前

    $ git format-patch HEAD^..HEAD