无需修改的 Git 存储推送

问题描述 投票:0回答:3

通常当我跑步时:

git stash push --all

如果我没有进行任何修改,则不会将任何内容推送到存储中。即使在这种情况下是否也可以强制推送,以便

git stash push --all && git stash pop
始终给出身份?

我问这个问题是因为在某些脚本中我想要

stash push
,做一些事情,并且
stash pop
,如果存储推送不创建新的存储,则存储弹出可能会弹出旧的且不相关的存储。另一个解决方案是从 GitPython 检测没有发生任何存储(我想说的是通过比较两个连续的输出
repo.git.stash("list")
),但这也会使代码变得有点复杂。

谢谢!

git gitpython
3个回答
0
投票

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


0
投票

除了 torek 的评论之外,即使这不能解决我最初的确切问题,也足以解决我的问题:我想指出 GitPython

repo.is_dirty(untracked_files=True)
的功能,它对于检查您是否有任何东西很有用到
stash push --all
。这样我就可以保存这个值供以后使用,如果我之前没有
stash pop
,就不要
stash push --all

注意:到目前为止似乎有效,但也许我错过了一些在某些情况下可能很重要的重要选项,所以请告诉我是否是这种情况!


0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.