我有一些修改过的文件,还有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中运行了此代码,这是一个或多个错误消息的原因。以为我会把它包括进去,因为这可能会使其他人困惑
答案 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 -u
或stash -a
)提交在 no 分支上。这两个或三个提交保持:
-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 stash
和git 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
来写。在应用它之前,您可以运行^
(以相同的倍数进行查看)。