git由于参数排序错误和丢失的未跟踪文件而导致部分失败

时间:2018-10-23 10:14:29

标签: git 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个未跟踪的文件已消失。我真的可以和他们一起做,所以任何帮助将不胜感激

仅需补充一点:我使用PoshGit在Powershell中运行了此代码,这是一个或多个错误消息的原因。以为我会把它包括进去,因为这可能会使其他人困惑

1 个答案:

答案 0 :(得分:1)

TL; DR:您遇到了commit 833622a945a6, "stash push: avoid printing errors"中修复的错误,该错误首先出现在Git 2.18.0中。如果您的Git至少为2.16.2,就可以了,否则,您可能会遇到commit 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 clean错误清除的文件根本无法通过Git恢复(但是我认为,考虑到我认为已运行的内容以及错误消息,就可以了)。

(在大多数情况下,我建议避免过分使用git stash-通常最好只是进行一次临时提交。您还可以避免绊倒这些错误。)

首先,请注意:git stash的作用是进行(或使用)提交,特别是两次(常规存储)或三个(stash -ustash -a)提交在 no 分支上。这两个或三个提交保持:

  • 索引状态; <​​/ li>
  • 工作树状态; <​​/ li>
  • 任何未跟踪的文件(如果使用-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

这是有道理的,因为--表示选项的结尾,之后所有 all 字符串都用作路径名或路径规范(路径名的概括,其中诸如{{1 }}的意思是“所有文件”。在这种情况下,您为Git提供了以下三个路径规范:

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

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

这是git write-tree-u进行的第三次提交,路径规范在这里对您最重要:它将提交限制为仅包含 匹配的未跟踪文件,而不是所有未跟踪的文件(可能被-a忽略)。这也是令人讨厌的错误出现的地方:将文件内容保存为提交后,-a实际上运行git stashgit reset --hard来设置索引和工作树状态回到原来的状态,然后删除保存在额外提交中的文件。

我相信2.16.2中添加的修复程序会产生2.18.0中修复的投诉。如果是这样,则意味着您的git clean没有清除太多文件;相反,它清除了正确的文件(保存在第三次提交中的文件),然后抱怨,因为您的pathspec仅匹配未跟踪的文件和/或由于匹配了 no 文件的额外参数。

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