首页 > 解决方案 > 由于错误排序的参数和丢失的未跟踪文件,git stash 部分失败

问题描述

我有一些修改过的文件,我有 2 个未跟踪的文件。

我想存储一些修改和未跟踪的文件我想存储的所有想法都在同一个目录中,所以我使用它和最后的通配符来实现将所有文件存储在其中。

所以我跑了

git stash push -u  -- File/Path/To/FolderOfFilesIWantCommited/* -m "My Message"

这返回了这个

Saved working directory and index state WIP on [Branch Name]: [Commit Sha1] [commit message]
fatal: pathspec '-m' did not match any files
error: unrecognized input

这条消息就是我在标题中说“部分失败”的原因。目前还不清楚这里发生了什么

我意识到我应该跑的是

git stash push -u -m "My Message"  -- File/Path/To/FolderOfFilesIWantCommited/* 

然而,在第一次尝试失败后,我所有的修改都没有上演,但仍然存在。然而,2个未跟踪的文件已经消失了。我真的可以和他们一起做,所以任何帮助将不胜感激

只是一个补充说明:我在 Powershell 中使用 PoshGit 运行了这个,这是一个或多个错误消息的原因。以为我会包括这个,因为它可能会混淆其他人

标签: gitgit-stash

解决方案


TL;DR:您遇到了在提交 833622a945a6 中修复的错误,“stash push:避免打印错误”,该错误首次出现在 Git 2.18.0 中。如果你的 Git 至少是 2.16.2,你没问题,否则你可能遇到了在提交 bba067d2faf0 中修复的相当严重的错误,“stash: don't delete untracked files that match pathspec”但从未在发行说明。

接受路径规范的push子命令首次出现在 Git 2.13.0 中。如果从子目录运行,直到它在 2.13.2 / 2.14.0 中修复,它就会很糟糕。而且,它在 2.16.2 之前表现不佳:它可能会运行git clean太多文件。由于git clean删除了未跟踪的文件(可选地包括这些被忽略的子集),并且未提交的文件不提交(除了特殊的-u/-a提交),它们可以在这一点上消失。

如果你没问题——如果你的 Git 至少是 2.16.2,我认为是这样——忽略抱怨;git stash pop存储并使用更正的参数重新运行命令,以按照您要求的方式命名存储。如果不是,则根本无法通过 Git 恢复被错误清理的文件git clean(但我认为,鉴于我认为您运行的内容以及错误消息,您是可以的)。

(我建议在大多数情况下避免棘手的使用git stash——通常最好只做一个临时提交。你也可以避免被这些类型的错误绊倒。)

首先,一个快速的旁注:做什么git stash是进行(或使用)提交,特别是两个(常规存储)或三个(stash -u或)没有分支stash -a的提交。这两个或三个提交持有:

  • 索引状态;
  • 工作树状态;
  • 任何未跟踪的文件,如果使用-u-a

git stash push,以及它的一些错误

git stash push -u  -- File/Path/To/FolderOfFilesIWantCommited/* -m "My Message"

[然后失败了]

Saved working directory and index state <msg>
fatal: pathspec '-m' did not match any files
error: unrecognized input

这是有道理的,因为--表示选项的结束,之后所有字符串都被视为路径名或路径规范(路径名的概括,其中诸如*“所有文件”之类的东西)。在本例中,您为 Git 提供了以下三个路径规范:

  • File/Path/To/FolderOfFilesIWantCommited/*
  • -m
  • My Message

这些是 Git 应该保存在它所做的提交中的特定文件。这里有一些奇怪的皱纹,因为在一般情况下,任何提交都会保存每个(跟踪的)文件。我们几乎可以忽略这个事实——虽然git stash save仍然将每个跟踪的文件保存在两个主要提交中,但 path-spec 所做的是告诉在工作树提交中保存git stash 哪个版本:它应该保存工作树版本还是索引版本?如果 pathspec 匹配与跟踪文件匹配,则工作树版本是保存的版本;否则索引版本是保存的版本。(索引提交仍会像往常一样git stash使用运行时保存所有索引内容。)git write-tree

这是由-uor进行的第三次提交,-a此处路径规范对您最重要:它将提交限制为包含匹配的未跟踪文件,而不是所有未跟踪(并且可能被忽略-a)文件。这也是讨厌的错误出现的地方:将文件的内容保存在提交、git stash运行、本质上git reset --hardgit clean中,将索引和工作树状态设置回原来的状态,并删除保存在额外文件中的文件犯罪。

我相信 2.16.2 中添加的修复程序会产生 2.18.0 中修复的投诉。如果是这样,这意味着您git stash push没有清理太多文件;相反,它清理了正确的文件——那些保存在第三次提交中的文件——然后抱怨因为你的路径规范只匹配未跟踪的文件和/或因为额外的参数不匹配任何文件。

在极端情况下,如果您只想在不使用 的情况下获取第三个“u”提交中的文件git stash,请考虑运行git show stash^^3 | git apply(注意:这是git show stash,首先是单词show,而不是git stash show!)。第三次提交git stash是 的第三个父级refs/stash,因此stash^3。在 PowerShell 中,我相信这必须用加倍的^. 您可以git show stash^^3在应用之前运行(使用相同的加倍)来查看它。


推荐阅读