如何导出 git stash

epi*_*pi4 14 git

我想导出我在.zip/.gz文件中的存储列表中看到的一个存储(更改)。我找到了以下命令:

git stash show -p > patch
Run Code Online (Sandbox Code Playgroud)

它将更改保存在文件中,但我也想保留.png文件等......我正在寻找一种方法来压缩文件或文件夹中存储中包含的所有更改。你知道任何解决方案吗?

Sam*_*ert 22

尝试使用--binary导出选项

git stash show -p --binary > changes.patch
Run Code Online (Sandbox Code Playgroud)

当你想导入它时,应用补丁

git apply changes.patch
Run Code Online (Sandbox Code Playgroud)


Mar*_*ger 9

虽然 Samual Robert 的回答确实解决了上述问题,但需要注意的是:

git stash show将所有暂存和未暂存更改合并到一个补丁中,并且即使您使用git stash -u. 默认情况下git apply会将补丁中的所有更改都变成未暂存的更改;您可以通过提供--index选项使它们上演。但是要保留暂存和未暂存更改之间的区别,或者包含存储中的未跟踪文件,您需要做一些其他事情。

一个存储在内部由两个或三个提交和一些引用操作组成,所以一个选择是从每个提交生成一个补丁,然后在另一端手动重建存储。由于提交的相关方式,获得正确的补丁需要一些技巧。

git show stash^2 --binary >index.patch
git show stash^3 --binary >untracked.patch
git diff --binary stash^2 stash >wip.patch
Run Code Online (Sandbox Code Playgroud)

然后在接收端

git apply index.patch
git add .
git apply wip.patch
git apply untracked.patch
Run Code Online (Sandbox Code Playgroud)

现在未提交的状态已经在另一个 repo 上重新创建,如果你愿意,你可以将它重新存储在那里。

如果您需要在接收端直接将更改具体化为存储,而无需通过您的工作树和索引——例如,因为接收端未处于“干净”状态——您可以使用捆绑包来完成。但是有一个技巧可以使这项工作发挥作用。在源代码库上

git bundle create stash.bundle stash^..stash
Run Code Online (Sandbox Code Playgroud)

在接收回购

git remote add bundle stash.bundle
git fetch stash:temp
git update-ref --create-reflog refs/stash temp
git branch -D temp
Run Code Online (Sandbox Code Playgroud)

请注意,我们必须给出一个明确的 refspec 才能将stashref 从包中取出。如果我们将它直接映射到 refs/stash,那么我们就不能指望创建一个 reflog 条目——如果没有 reflog 条目,它就不是一个可用的 stash。因此,我们将其引入临时分支,然后用于update-ref创建(或移动)stash引用并更新引用日志。