是否可以搜索Git的隐藏项目?

kgqe7b3p  于 2022-12-21  发布在  Git
关注(0)|答案(7)|浏览(162)

这周我学习了如何使用Git stash,发现所有这些stash都在我的系统中累积。我放错了一些代码,现在我有一打0-11的stash。
有没有一种方法可以让我在这些隐藏文件中搜索字符串值,以找到我要找的代码?或者我只需要遍历并重新应用每个隐藏文件,以在其中搜索/查找我要找的代码?

**2021年3月18日:**我发现了其他相关信息。

你可以创建一个Git别名来搜索所有分支。修改你的.gitconfig文件并调用git stash-search <pattern>

[alias]
    stash-search = "!f() { git show $(git stash list | cut -d\":\" -f 1) | grep \"$@\" ; }; f"
yeotifhr

yeotifhr1#

有一些有用的想法in this Gist and discussion thread
首先,列出匹配的stash很容易(使用或不使用-i,取决于大小写)

git stash list -i -G<regexp>

如果没有那么多需要挖掘的内容,您可以添加-p来完整地打印匹配的存储。

git stash list -i -p -G<regexp>

为“真实的”案例提供更多功能,将其添加到.gitconfig

[alias]
    stashgrep = "!f() { for i in `git stash list --format=\"%gd\"` ; \
              do git stash show -p $i | grep -H --label=\"$i\" \"$@\" ; done ; }; f"

然后你可以用任何你喜欢的grep参数(-w-i)来调用git stashgrep

git stashgrep -i <regexp>

这与上面的一些答案不同,因为它会在隐藏ID之前显示每个差异的来源:

% git stashgrep -i tooltip
stash@{5}: //            resetBatchActionTooltip();
stash@{5}:         addAcceleratorsAndTooltips(lToolMenu, lToolButton, iListener, iTool);
stash@{5}:     private void addAcceleratorsAndTooltips(AbstractButton lToolMenu,
stash@{5}:+        String lToolTip = iTool.getToolTipText();
stash@{5}:             lToolButton.setToolTipText(lToolTip);
stash@{20}:+    private static final String invalidSelectionTooltip = "Invalid selection.  Please choose another.";
stash@{20}:-    private final String invalidSelectionTooltip = "Invalid selection.  Please choose another.";
stash@{20}:                         ((JTextField)lComponent).setToolTipText(
qoefvg9y

qoefvg9y2#

git stash show -p stash@{n} | grep "john cena"是我认为唯一的选择。
当然你可以写你自己的剧本。

chhkpiq4

chhkpiq43#

git stash list -S "my string"在Git 2.28上工作,用于查找添加或删除"my string"的补丁。
我不知道这种能力存在了多久;文档暗示它应该接受与git log相同的所有选项,包括-S,但我清楚地记得几年前还不能用这种方式进行搜索。

iaqfqrcu

iaqfqrcu4#

一行:

git grep whatever $(git stash list -q | cut -d":" -f 1)

git grep会很方便地输出修改后的行,其中包含stash的名称和文件的名称:

stash@{43}:common/ot/whatever.js:exports.whatever = (foo, deps) => {
stash@{44}:common/ot/whatever.js:exports.whatever = (foo, deps) => {
9rnv2umw

9rnv2umw5#

git grep命令接受"树"对象:
概要

git grep [-a | --text] [-I] [--textconv] [-i | --ignore-case] [-w | --word-regexp]
              [-v | --invert-match] [-h|-H] [--full-name]
              [-E | --extended-regexp] [-G | --basic-regexp]
              [-P | --perl-regexp]
              [-F | --fixed-strings] [-n | --line-number]
              [-l | --files-with-matches] [-L | --files-without-match]
              [(-O | --open-files-in-pager) [<pager>]]
              [-z | --null]
              [-c | --count] [--all-match] [-q | --quiet]
              [--max-depth <depth>]
              [--color[=<when>] | --no-color]
              [--break] [--heading] [-p | --show-function]
              [-A <post-context>] [-B <pre-context>] [-C <context>]
              [-W | --function-context]
              [--threads <num>]
              [-f <file>] [-e] <pattern>
              [--and|--or|--not|(|)|-e <pattern>...]
              [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | <tree>...]
              [--] [<pathspec>...]

现在考虑一个隐藏条目是一个树对象,该树对象是从你调用git stash时的工作树的内容合成的,它的两个双亲是HEAD处的状态和索引中的状态;引用该手册:
一个stash被表示为一个提交,它的树记录了工作目录的状态,它的第一个父提交是在HEAD创建stash时的提交,第二个父提交的树记录了索引在stash创建时的状态,它是HEAD提交的一个子提交。

.----W
             /    /
       -----H----I

其中HHEAD提交,I是记录索引状态的提交,以及W是记录工作树状态的提交。
因此,您可以有三个位置来grep您的stash条目:

  • git grep [options] term stash@{n}将对termW提交进行grep,也就是说,它将对工作树文件的保存状态进行grep。
  • 要grep一个隐藏条目的索引状态,您需要引用W的第二个父项;这是使用^2后缀完成的:
git grep [options] term stash@{n}^2
  • 要grep stash条目的基线提交状态(最不有趣的情况),请参考它的第一个父条目:
git grep [options] term stash@{n}^1

git help revisions手册中对^<n>表示法进行了解释:
<rev>^,例如HEAD^v1.5.1^0修订参数的后缀^表示该提交对象的第一个父对象。^<n>表示第<n>个父对象(即<rev>^等于<rev>^1)。作为特殊规则,<rev>^0表示提交本身,并且在<rev>是引用提交对象的标签对象的对象名时使用。

TL; DR

对于顶层藏匿项,请使用

  • git grep whatever stash@{0}以grep工作树的状态。
  • git grep whatever stash@{0}^2以grep索引的状态。
wqsoz72f

wqsoz72f6#

基于流行的答案,我用这个:

git stash list -p |less

我觉得这样更好记。

3htmauhk

3htmauhk7#

要添加到Andrejs Cainikovs的答案,您可以添加seq以搜索所有seq 0 5 | xargs -I {} git stash show -p stash@{\{\}} | grep your_pattern

相关问题