bash脚本和终端的git签出行为不同

bash脚本和终端的git签出行为不同,git,terminal,checkout,script,Git,Terminal,Checkout,Script,我正在尝试使用git和bash脚本对代码进行回归测试。 因此,我编写了一个脚本,用当前版本和一些以前的版本运行一个示例。 源文件位于“src”目录中,示例位于不同的“samples”目录中。 git在同一项目下跟踪“src”和“samples”目录 我只想回滚“src”文件和“samples”中的非接触文件。 我尝试过git重置和git签出 问题: 当我转到终端中的“src”并键入: git checkout -- *.F90 它做应该做的事情-仅更改此目录中的Fortran文件 如果我在ba

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

我只想回滚“src”文件和“samples”中的非接触文件。 我尝试过git重置和git签出

问题: 当我转到终端中的“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命令,我确实看到了源文件,我在正确的位置

有什么想法吗?

来自“路径规范”的:

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

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

git签出源/主--“$PWD”/*.F90
请注意(正如他们在评论中所指出的),手册中提到了Git的功能。如果shell可以首先展开glob,那么它将展开glob–例如,如果当前目录中存在与
*.F90
匹配的文件

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

git签出源/主--“$PWD/*.F90”
或者在pathspec中使用

git签出源/主--./*.F90

非常感谢!它起作用了!!请注意,sh/bash会将
*.F90
扩展到
$PWD
中确实存在的文件,这在大多数情况下可以避免问题。但是(这显然是咬@MikhailModestov的地方)如果没有
*.F90
文件,bash/sh只会将文本
*.F90
传递给Git。您也可以在这里使用
/*.F90
:我自己倾向于这样做,但任何有效的都可以。:-)@torek Good point–Git手册描述的行为指的是shell参数扩展后的任何行为;与许多命令不同,您甚至可以引用
'*.F90'
,因为Git有自己的扩展,并且该扩展不同于shell扩展(其中
*
/
不匹配)。让我修改一下。