bash脚本和终端的git签出行为不同
我正在尝试使用git和bash脚本对代码进行回归测试。 因此,我编写了一个脚本,用当前版本和一些以前的版本运行一个示例。 源文件位于“src”目录中,示例位于不同的“samples”目录中。 git在同一项目下跟踪“src”和“samples”目录 我只想回滚“src”文件和“samples”中的非接触文件。 我尝试过git重置和git签出 问题: 当我转到终端中的“src”并键入: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 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扩展(其中*
与/
不匹配)。让我修改一下。