仅限Zip最新提交的更改

Mar*_*len 21 git bash

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

git archive -o ../latest.zip some-commit
Run Code Online (Sandbox Code Playgroud)

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

git diff --name-only previous-commit latest-commit | zip ../changes.zip -@
Run Code Online (Sandbox Code Playgroud)

但是,这将从我的工作副本中压缩文件,这可能有未提交的更改.有没有办法只获取已更改的文件,因为它们直接提交到拉链?

Cas*_*bel 42

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

git archive -o ../latest.zip some-commit $(git diff --name-only earlier-commit some-commit)
Run Code Online (Sandbox Code Playgroud)

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

git diff --name-only earlier-commit some-commit | xargs -d'\n' git archive -o ../latest.zip some-commit
Run Code Online (Sandbox Code Playgroud)

如果你没有正确安装xargs,你可以做一个替代方案:

#!/bin/bash

IFS=$'\n'
files=($(git diff --name-only earlier-commit some-commit))

git archive -o ../latest.zip some-commit "${files[@]}"
Run Code Online (Sandbox Code Playgroud)

写作shell脚本,但也应该作为一个单行.另外,变更earlier-commit,some-commit以及../latest.zip$1 $2$3你已经有了自己的可重复使用的脚本.

  • 请注意,提取此类存档不会删除任何文件.这可能导致以后难以诊断问题. (5认同)

Tim*_*gan 5

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

git stash
git checkout latest-commit
git diff --name-only previous-commit | zip ../changes.zip -@
git checkout master
git stash apply
Run Code Online (Sandbox Code Playgroud)

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

注2:git checkout latest-commit会让你处于一个分离的状态。请务必git checkout master在完成后执行,否则您可能会在未来的提交中遇到问题。