仅限Zip最新提交的更改

时间:2010-08-06 12:02:12

标签: git bash

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

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

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

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

然而,这将从我的工作副本中压缩文件,这些文件可能有未提交的更改。有没有办法只获取已更改的文件,因为它们直接提交到zip?

5 个答案:

答案 0 :(得分:42)

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,您就可以获得可重复使用的脚本。

答案 1 :(得分: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,否则您最终可能会遇到问题。

答案 2 :(得分:2)

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

只需在git资源库的根目录中运行脚本,并将修订版哈希传递给命令行。

Link to the script on hithub

答案 3 :(得分:1)

我赞成一个解决方案,一行而且非常简单:

lauxlib.h

您也可以使用此方法使用tar等任何其他归档方法。

答案 4 :(得分:-1)

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

$ git format-patch HEAD^..HEAD