[英]Git delete stash by name/message
据我所知 Git 不能按名称/消息删除存储(尽管它可以按名称保存 git 存储保存“名称”)。 但是,我真的很想为我的工作流程创建一个“组合别名”选项(特别是对于不太熟悉 git 并且应该尊重工作流程的同事)
我知道我可以自己创建一个 bash 脚本,但我在想也许有人已经制作了这样的脚本?。 这样我就可以按名称删除存储...
我的“更新”别名大致是这样的:
git stash save -u "tempstash"
git fetch origin
[apply our workflow/update strategy]
git stash pop --index (should be: git stash delete "tempstash")
当前别名的问题是,如果没有任何东西可以存储,它将恢复旧的存储。
另一种选择是检查是否需要隐藏,但我一直想要一个 git 隐藏按名称删除选项,所以这就是我问这个的原因。
PS:我正在使用 posh-git 但 bash 命令应该在别名中工作。
谢谢
您可以先检查是否有任何东西可以存储,以解决该问题。 您可以使用一种方法来检查索引是否为脏,这是使用Git检查脏索引或未跟踪文件中建议的方法
例如,如果存储没有变化,此命令将不输出任何内容:
git status --porcelain
使用此命令,脚本可能如下所示:
is_stashing=$(git status --porcelain)
test -n "$is_stashing" && git stash save -u
git fetch origin
[apply our workflow/update strategy]
test -n "$is_stashing" && git stash pop --index
一种解决方案是使用git reflog stash
的名称作为regexp
搜索git reflog stash
区,并以stash@{<number>}
格式获取其名称。
然后,您可以在git中创建一个别名,以用作命令。 可以大大改进的快速而肮脏的解决方案是:
[alias]
sshow = "!f() { git stash show `git reflog stash | egrep $* | awk '{printf $2}' | sed 's/://' `; }; f"
ssdrop = "!f() { git stash drop `git reflog stash | egrep $* | awk '{printf $2}' | sed 's/://' `; }; f"
通过在.git/config
添加这两个别名,您可以看到.git/config
在文件中的文件修改为:
git sshow <regexp matching the name of the stash>
您可以使用以下方式删除存储:
git ssdrop <regexp matching the name of the stash>
我找到了一种按名称删除藏匿处的方法。 你可以这样做:
git stash drop stash@{$((git stash list | grep -w NAME_OF_THE_STASH) | cut -d "{" -f2 | cut -d "}" -f1)}
这是脚本的细分:
git stash drop stash@{n}
结构n
。 为此,我们列出了藏匿处和 grep 具有匹配名称的项目。 为此,我使用了脚本: git stash list | grep -w NAME_OF_THE_STASH
git stash list | grep -w NAME_OF_THE_STASH
{}
内的索引。 我们可以通过在第 2 项的脚本中添加以下内容来提取该数字| cut -d "{" -f2 | cut -d "}" -f1
| cut -d "{" -f2 | cut -d "}" -f1
我测试了它,它对我很有用。
顺便说一句,如果您输入一个不存在的名称,则不会删除任何内容。
此外,只会删除完全匹配的名称。 如果您不需要完全匹配,则删除grep
之后的-w
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.