Git stash push不加修改

snvhrwxg  于 2023-09-29  发布在  Git
关注(0)|答案(3)|浏览(115)

我通常跑步时:

git stash push --all

如果我没有任何修改,就没有东西被推到藏匿处。即使在这种情况下,是否也可以强制推送,以便git stash push --all && git stash pop始终给出标识?
我问这个问题是因为在一些脚本中,我想stash push,做一些事情,然后stash pop,如果stash push没有创建新的stash,stash pop可能会弹出旧的和不相关的stash。另一种解决方案是从GitPython检测没有发生任何隐藏(我会说通过比较两个连续repo.git.stash("list")的输出),但它也会使代码变得复杂。
谢谢你,谢谢!

r8xiu3jd

r8xiu3jd1#

git stash的一般用途是存储您不想提交的更改数据,或者当您交换到另一个分支时返回此更改。如果你没有任何未提交的更改,你想如何隐藏一些东西呢?我觉得是你的行为有问题。获得相同结果的更简单方法是将仓库/分支状态重置为实际提交,然后存储弹出。我的意思是我会向你推荐这样的东西。git stash-> do some stuff -> git reset --hard(这会丢弃所有本地更改,但不会清除stash),然后使用git pop获取“do some stuff”之前的状态。

rsl1atfo

rsl1atfo2#

除了torek的评论之外,即使这不能解决我最初的问题,也足以解决我的问题:我想指出GitPython repo.is_dirty(untracked_files=True)的功能,它可以用来检查你是否有任何stash push --all。这样我就可以保存这个值以供以后使用,如果我以前没有stash push --all,就不做stash pop
NB:到目前为止,它似乎工作,但也许我错过了一些重要的选项,在某些情况下可能有重要性,所以让我知道,如果是这样的话!

jmp7cifd

jmp7cifd3#

从这个意义上说,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

相关问题