在git中,有没有一种方法可以在不应用隐藏的情况下显示未跟踪的隐藏文件?

在git中,有没有一种方法可以在不应用隐藏的情况下显示未跟踪的隐藏文件?,git,git-stash,Git,Git Stash,如果我运行git stash-u,我可以隐藏未跟踪的文件。但是,所说的未跟踪文件在使用git stash show stash@{0}时根本不会显示。有没有办法在不应用隐藏的情况下显示未跟踪的隐藏文件?未跟踪的文件存储在隐藏提交的第三个父级中。(这实际上并没有文档记录,但从短语的使用方式来看非常明显……或者仅仅通过执行git log--graph stash@{0}) 您可以通过以下方式查看存储的“未跟踪”部分: git show stash@{0}^3 或者,只是“未跟踪”树本身,通过: g

如果我运行
git stash-u
,我可以隐藏未跟踪的文件。但是,所说的未跟踪文件在使用
git stash show stash@{0}
时根本不会显示。有没有办法在不应用隐藏的情况下显示未跟踪的隐藏文件?

未跟踪的文件存储在隐藏提交的第三个父级中。(这实际上并没有文档记录,但从短语的使用方式来看非常明显……或者仅仅通过执行
git log--graph stash@{0}

您可以通过以下方式查看存储的“未跟踪”部分:

git show stash@{0}^3
或者,只是“未跟踪”树本身,通过:

git show stash@{0}^3:
或者,树中的特定“未跟踪”文件,通过:

git show stash@{0}^3:<path/to/file>
git show stash@{0}^3:
不幸的是,没有好的方法来总结所有阶段+未阶段+未跟踪与“当前”状态之间的差异。ie:
git show stash@{0}
不能包含未跟踪的文件。这是因为stash commit本身的树对象(称为
stash@{0}:
)不包括来自第三个“未分级”父级的任何更改


这是由于重新应用存储的方式:跟踪的文件可以轻松地作为修补程序应用,而未跟踪的文件理论上只能作为“整个文件”应用。

您可以使用以下命令列出所有存储提交:

git rev-list -g stash
由于隐藏表示为头、索引和未跟踪文件的无父“根”提交的3路合并提交,因此可以通过将上述输出管道化到以下内容来列出未跟踪文件的隐藏:

git rev-list -g stash | git rev-list --stdin --max-parents=0
上述功能的有用应用:

仅显示未跟踪、隐藏的文件 当然,删除
--stat
以查看文件的内容

查找特定文件
要列出隐藏中未跟踪的文件,请执行以下操作:

git ls-tree -r stash@{0}^3 --name-only
要显示所有未跟踪文件(包含内容)的完整差异,请执行以下操作:

这些命令读取最后(最近)的存储。对于早期的隐藏,增加“stash@”后面的数字,例如
stash@{2}
为最后一个隐藏的第二个

这项工作的原因是,
git stash
为每个stash创建一个合并提交,可以引用为
stash{0}
stash{1}
等。此提交的第一个父级是隐藏时的头,第二个父级包含对跟踪文件的更改,第三个父级(可能不存在)对未跟踪文件的更改


这在中有部分解释。

为了查看隐藏中的所有文件(包括跟踪的和未跟踪的),我将此别名添加到配置中:

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"
它需要一个你想要查看的藏品。注意,它仍将在两个背靠背列表中显示


如果没有通过,
if…fi
节$1到0

一个解决方法:在存放文件之前先暂存文件,这将使
git stash show-p
按预期工作

git add .
git stash save
注意:这种方式也提供了添加交互部分的功能。
注意事项:确保您之前没有进行过阶段性工作,否则您将无法区分它。
这可能有用

但是,所说的未跟踪文件在使用
git stash show stash@{0}
时根本不会显示

注:(2016年第4季度,即指数运行后4年),您只能参考其指数

git stash show 0
最近出现了一个bug,原因是
git stash
正在用C语言重写(2019年第2季度)

是否有任何方法可以在不应用隐藏的情况下显示未跟踪的隐藏文件

为什么,是的,有,Git 2.32(2021年第二季度,OP后9年)

“”()学会了选择性地显示隐藏的未跟踪部分

参见(2021年3月3日)作者 (于2021年3月22日合并)

:教学
--包括未跟踪的
--仅未跟踪的

签字人:刘丹东

可以通过()使用未跟踪的文件创建隐藏条目

但是,由于未跟踪的文件存储在存储项的第三个父项中,而不是存储项本身,因此running()不会将未跟踪的文件作为差异的一部分

带有
——包括未跟踪的
,未跟踪的路径记录在第三个父级(如果存在)中,除了在存储库和存储中的工作树之间进行修改的路径之外,还会显示这些路径。

可以手动创建格式错误的隐藏条目,其中隐藏条目中重复的未跟踪文件将屏蔽跟踪的文件。
在这种情况下,我们通过一个定制的
解包树()
回调:
隐藏工作树\u未跟踪的\u合并()
来检测并出错

另外,设定“隐藏”
——仅未跟踪的
选项,该选项仅显示隐藏条目的未跟踪文件。
这与()类似,但为其提供方便的抽象很好,这样用户就不必考虑底层实现

git stash
现在在其

'git stash'show[-u |--包括未跟踪的|--仅未跟踪的][]
git stash
现在在其

--不包括未跟踪的
push
save
命令一起使用时, 所有未跟踪的文件也被隐藏起来,然后用
git clean

show
命令一起使用时,显示隐藏中未跟踪的文件 作为差异的一部分输入

--仅未跟踪
此选项仅对
show
命令有效。
作为差异的一部分,仅显示隐藏条目中未跟踪的文件


您有一个与这些新选项配套的配置:

:了解
stash.showIncludeUntracked
签字人:刘丹东

上一次提交指示()。
用户可能希望能够始终启用
——包括未跟踪的
行为。
教授
stash.showIncludeUntracked
config选项,该选项允许用户在si中执行此操作
git ls-tree -r stash@{0}^3 --name-only
git show stash@{0}^3
showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"
git add .
git stash save
git stash show 0
'git stash' show [-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]