Git有一个非常方便的archive命令,它允许我在.zip存档中制作一个特定提交的副本,如下所示:
git archive -o ../latest.zip some-commitRun 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你已经有了自己的可重复使用的脚本.
如果创建补丁不是一个选项,那么像这样的事情怎么样:
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在完成后执行,否则您可能会在未来的提交中遇到问题。
| 归档时间: |
|
| 查看次数: |
11836 次 |
| 最近记录: |