Git Stash 上的 Git PathSpec 问题

问题描述 投票:0回答:2

当我运行其新命令 stash -p -- {pathspec} 的新版本

2.13.0.windows.1

git stash -p -- AB.Dir1/Dir2/DestinationHierarchyCreator.cs

它报告错误

错误:路径规范“AB.Dir1/Dir2/DestinationHierarchyCreator.cs”与 git 已知的任何文件都不匹配。

然而,当我执行

git status
我实际上从哪里复制文件时,它会报告

Your branch is up-to-date with 'origin/project/develop'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:  AB.Dir1/Dir2/DestinationHierarchyCreator.cs

如果我转到文件所在的目录并执行

git stash -p -- DestinationHierarchyCreator.cs
它会失败并出现相同的错误。

如果我运行命令

git stash -p -- *.cs
,那么我可以将片段保存到存储中。


那么我对

git stash -p
选项的理解是否错误,或者我对单个文件或其他文件的路径规范的处理是否不正确?

git git-stash
2个回答
2
投票

刚刚遇到了同样的问题。看来

git stash
路径规范必须相对于存储库根(顶部)——而不是相对于您当前的工作目录。

由于

git status
(“与许多其他 Git 命令不同”)显示路径“相对于当前目录(如果您在子目录中工作)”,这似乎很容易造成混淆。

因此,如果您当前的工作目录是 ~/dev/git_project_root/subdir,您需要使用:

git stash -p -- subdir/AB.Dir1/Dir2/DestinationHierarchyCreator.cs

(通配符

git stash -p -- *.cs
有效,因为它匹配根目录下所有修改过的 *.cs 文件——而且可能你只有那个文件。)


1
投票

我刚刚在 Windows 上尝试过:它适用于没有“

.
”的普通文件夹

C:\Users\vonc\data\git\git>git st
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   Documentation/blame-options.txt

C:\Users\vonc\data\git\git>git stash -- Documentation\blame-options.txt
Saved working directory and index state WIP on master: b14f27f91 Tenth batch for 2.13

即使在 bash 会话中,并且使用 -p,它仍然有效

vonc@bvonc MINGW64 ~/data/git/git (master)
$ git stash -p -- Documentation/blame-options.txt
diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index dc41957af..96a5b1b4a 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -1,7 +1,7 @@
 -b::
        Show blank SHA-1 for boundary commits.  This can also
        be controlled via the `blame.blankboundary` config option.
-
+sss
 --root::
        Do not treat root commits as boundaries.  This can also be
        controlled via the `blame.showRoot` config option.
Stash this hunk [y,n,q,a,d,/,e,?]? y

Saved working directory and index state WIP on master: b14f27f91 Tenth batch for 2.13

在带有“

.
”的文件夹上:

vonc@bvonc MINGW64 ~/data/git/git (master)
$ git stash -p -- a.b/c
error: pathspec 'a.b/c' did not match any file(s) known to git.
Did you forget to 'git add'?

所以这可能是一个可能的问题。


注意,使用 Git 2.29(2020 年第 4 季度),不再有“

Show blank SHA-1 for boundary commits
”:一些面向最终用户的消息已更新为与哈希算法无关。

请参阅 Junio C Hamano (gitster)

commit 4279000(2020 年 8 月 13 日)。
(由 Junio C Hamano --
gitster
--
合并于 commit 2a978f8,2020 年 8 月 19 日)

messages
:避免在面向最终用户的消息中使用 SHA-1

当我们指的是面向最终用户的消息中的(十六进制)对象名称时,仍然有少量提及 SHA-1。
重写它们。

我希望这主要是 s/SHA-1/对象名称/,但需要重新措辞一些消息以保持结果的可读性。

然后新的错误消息将是:

Do not show object names of boundary commits

在 Git 2.47(2024 年第 4 季度)中,第 8 批,修复了“

git stash
(man) 中的极端情况错误。

请参阅提交 e3209bd(2024 年 8 月 16 日),作者:Patrick Steinhardt (

pks-t
)
(由 Junio C Hamano --
gitster
--
合并于 commit 62c5b88,2024 年 8 月 23 日)

builtin/stash
:将
--keep-index --include-untracked
修复为空
HEAD

报道者:Piotr Siupa
签字人:Patrick Steinhardt

据报道,当 HEAD 指向树为空的提交时,使用

--keep-index --include-untracked
创建存储会导致错误:

$ git stash push --keep-index --include-untracked
error: pathspec ':/' did not match any file(s) known to git

此错误来自

git checkout --no-overlay $i_tree -- :/
(man),我们执行该操作将工作树重置为索引中的状态。
由于在我们的例子中从索引生成的树是空的,“
:/
”不匹配任何文件,从而导致
git-checkout
(1) 出错。

通过在索引树为空时跳过结帐来修复问题。
正如代码注释中所解释的,这应该是正确的做法,因为我们首先不需要重置任何内容。

代码注释:

保留暂存条目时,我们需要重置工作目录以匹配索引的状态。
当索引是空树时可以跳过此操作,因为在这种情况下没有任何内容可以重置:

  • 当索引有任何文件时,无论是否暂存,根据定义树都不能为空,因此我们进入条件。
  • 当索引没有文件时,我们唯一需要关心的是给出
    --include-untracked
    时未跟踪的文件。
    但由于我们已经进一步执行
    git-clean
    (1) 来删除此类未跟踪的文件,因此我们也不必在这里执行任何操作。

因此,在这种情况下,我们跳过调用

git-checkout
(1),也是因为在空树上运行它会导致由于路径规范不匹配任何内容而失败。

© www.soinside.com 2019 - 2024. All rights reserved.