Git有一个非常方便的archive
命令,它允许我在.zip存档中复制特定提交,如下所示:
git archive -o ../latest.zip some-commit
这将包含该提交的整个工作树。通常我只需要自上一版本以来更改过的文件。目前我使用它来将这些文件放入zip:
git diff --name-only previous-commit latest-commit | zip ../changes.zip -@
然而,这将从我的工作副本中压缩文件,这些文件可能有未提交的更改。有没有办法只获取已更改的文件,因为它们直接提交到zip?
答案 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-commit
,some-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 stash
和git stash apply
。
注2:git checkout latest-commit
会让你处于一个独立的头上。完成后请务必git checkout master
,否则您最终可能会遇到问题。
答案 2 :(得分:2)
为了实现一些有用的东西来解决这个问题,我实现了一个简单的bash脚本。该脚本采用修订哈希并创建包含所有已更改文件(包括目录层次结构)的tar.gz存档。 任何人都可以使用它或修改,如果能帮助某人,我会很高兴。
只需在git资源库的根目录中运行脚本,并将修订版哈希传递给命令行。
答案 3 :(得分:1)
我赞成一个解决方案,一行而且非常简单:
lauxlib.h
您也可以使用此方法使用tar等任何其他归档方法。
答案 4 :(得分:-1)
为什么不创建一个git补丁,然后可以将其应用到其他代码库?
$ git format-patch HEAD^..HEAD