问题描述
我正在尝试使用 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