通常当我跑步时:
git stash push --all
如果我没有进行任何修改,则不会将任何内容推送到存储中。即使在这种情况下是否也可以强制推送,以便
git stash push --all && git stash pop
始终给出身份?
我问这个问题是因为在某些脚本中我想要
stash push
,做一些事情,并且stash pop
,如果存储推送不创建新的存储,则存储弹出可能会弹出旧的且不相关的存储。另一个解决方案是从 GitPython 检测没有发生任何存储(我想说的是通过比较两个连续的输出repo.git.stash("list")
),但这也会使代码变得有点复杂。
谢谢!
git stash
的一般用途是存储您不想提交的更改数据,或者稍后当您交换到另一个分支时返回到此更改。那么,如果您没有任何未提交的更改,您想如何隐藏某些内容呢?
我认为这是你的行为变化带来的问题。获得相同结果的更简单方法是将存储库/分支状态重置为实际提交,然后存储弹出。我的意思是我会推荐你这样的东西。 git stash
-> 做一些事情 -> git reset --hard
(这会丢弃所有本地更改,但不会清除存储),然后使用 git pop
在“做一些事情”之前获取您的状态。
除了 torek 的评论之外,即使这不能解决我最初的确切问题,也足以解决我的问题:我想指出 GitPython
repo.is_dirty(untracked_files=True)
的功能,它对于检查您是否有任何东西很有用到stash push --all
。这样我就可以保存这个值供以后使用,如果我之前没有 stash pop
,就不要 stash push --all
。
注意:到目前为止似乎有效,但也许我错过了一些在某些情况下可能很重要的重要选项,所以请告诉我是否是这种情况!
git stash
从这个意义上说,自动化并不友好 - 当没有任何东西可以隐藏时,它会默默地忽略该操作。
解决方法是始终在
git stash push
之前创建一些临时文件。幸运的是,即使文件列在 .gitignore
中,它也能工作。我在脚本中使用以下安全机制:
#!/bin/bash
set -e
pid=$$
nopop=true
touch git-tmp-$pid
trap '$nopop || git stash pop; rm git-tmp-$pid' EXIT
git stash push -a
nopop=false
# ... prepare some stuff
# the following always keeps the stash, so state is consistent in case of failures later:
git stash apply
# ... do some stuff
# drop if everything went well, otherwise pop in exit function:
git stash drop
nopop=true