来自 bash 脚本和终端的 git checkout 行为不同

问题描述

我正在尝试使用 git 和 bash 脚本对我的代码进行回归测试。 所以我编写了一个脚本来运行当前版本和一些以前版本的示例。 源文件位于“src”目录中,样本位于不同的“samples”目录中。 “src”和“samples”目录都被git在同一个项目下跟踪。

我只想回滚“src”文件,而不要回滚“samples”中的触摸文件。 我试过 git reset 和 git checkout。

问题: 当我在终端中转到“src”并输入:

git checkout -- *.F90

它做了它应该做的 - 只改变这个目录中的 Fortran 文件

如果我在 bash 脚本中执行相同的命令,它会更改所有内容文件“src”和“samples”!就像从主目录运行一样,作为“git checkout”或“git reset origin/master”……怎么可能?

我在某处发现了在脚本中使用“env -i”的建议,但它也不起作用。

整个脚本大约500行,这里是git相关部分:

cd $dsrc                   # go to src directory
ls                         # debuging,just to see,that I am there
git stash
git checkout origin/master -- *.F90

使用 ls 命令我确实看到了源文件,我在正确的地方。

有什么想法吗?

解决方法

来自“pathspec”的 Git glossary

[...] 特别是,*? 可以匹配目录分隔符。

所以 *.F90 匹配所有 .F90 文件。要限制到当前目录,您可以使用

git checkout origin/master -- "$PWD"/*.F90

请注意(正如 torek 在他们的评论中指出的那样)手册提到了 Git 的作用。如果 shell 可以先扩展 glob,它就会——例如,如果当前目录中有文件 do 匹配 *.F90

只有在没有任何前缀时,Git 才会获取未扩展的文字 *.F90 并将 * 与任何前缀匹配,包括 /。为防止 shell 扩展,您可以引用 glob:

git checkout origin/master -- "$PWD/*.F90"

或在路径规范中使用 .

git checkout origin/master -- ./*.F90