【问题标题】:Programmatically get number of stashes in git以编程方式获取 git 中的存储数量
【发布时间】:2019-05-18 07:14:36
【问题描述】:

我需要不时重新申请项目中的“最旧”存储。 (是的,这是有原因的,是的,这很糟糕,但解决根本问题比现在仅使用 git stash 更耗时。)

但是,最旧的存储在列表中具有最高的编号,因此我无法应用它,除非先使用 git stash list 来查看它是什么编号。

有没有办法让 Git 打印它当前持有的存储数量,这样这样的东西总是会打印最后一个存储(在支持这种命令插值的 shell 中)?

git stash apply $(git stash <count-command>)

我意识到我可以使用这样的东西:

 git stash list | tail -1 | awk '{print $1}' | grep -oP '\d+'

...但这太可怕了,所以我想知道是否有更简单的方法。

【问题讨论】:

  • 你可以为你的“可怕的”工作解决方案定义一个短别名,不是吗?
  • 可能是git stash list |awk -F[{}] 'END{print $2}'
  • 有什么理由不使用带有单个提交的分支,您可以挑选吗?
  • @cody 是的,但我宁愿有一些我可以很容易记住的东西,以防我在没有.bashrc 设置的地方工作。
  • @KyleStrand 对于cherry-pick 命令,有一个名为--no-commit(或更短的-n)的标志。

标签: git shell git-stash


【解决方案1】:

给定一个带有此存储的小型示例存储库:

> git stash list
stash@{0}: WIP on foo/master: d9184b5 ...
stash@{1}: WIP on foo/master: d9184b5 ...

这会为您提供 number 个存储条目:

> git rev-list --walk-reflogs --count refs/stash
2

但是你必须减去 1 才能得到最后一个条目 :-( 感谢 @alfunx 可以在没有 shell 算法的情况下完成:

> git rev-list --walk-reflogs --count --skip 1 refs/stash
1

但要直接获取最旧的 stash ref,您可以使用:

> git log --walk-reflogs --pretty="%gd" refs/stash | tail -1
stash@{1}

这适用于您的情况,因为 git stash apply 支持纯数字和 stash@{$NUMBER} 作为存储标识符。

【讨论】:

  • 您可以--skip 1 将计数减一。
  • @alfunx 太棒了!谢谢!
【解决方案2】:

给定的解决方案过于复杂。

一个简单的解决方案就是计算git stash list给出的行数

$ git stash list | wc -l
     65

【讨论】:

  • 除了它在 Windows 中不起作用,而所有其他解决方案都是跨平台的。 ?
【解决方案3】:

由于您的 stash 只是一次提交,因此严格来说您不需要使用 stash 机制。一旦你知道你的存储的 SHA 一次,你可以每次都通过 SHA 挑选它,或者给它添加一个标签,这样你就可以按标签挑选它。

挑选樱桃时,使用-n--no-commit 标志。

【讨论】:

  • 我忘记了在没有引入新分支的情况下标记提交。谢谢!
  • 我认为我的帖子是对实际问题的回答,但这篇帖子解决了实际问题:-)
  • @A.H.同意。 +1 无论如何
  • 我实际上并不确定这是否理想,因为我不想希望将更改作为新提交包含在我的工作分支上;我希望能够在包括更改的情况下推送我的提交。
  • @Kyle 你可以随时软重置樱桃挑选的提交
猜你喜欢
  • 2015-08-25
  • 2019-03-25
  • 2010-09-15
  • 2021-08-20
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 2011-02-07
  • 2018-09-22
相关资源
最近更新 更多