1

我正在尝试使用 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 命令我确实看到了源文件,我在正确的位置。

有任何想法吗?

4

1 回答 1

1

来自“pathspec”的Git 词汇表:

[...],*并且? 可以匹配目录分隔符。

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

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

请注意(正如torek在他们的评论中指出的那样)该手册指的是Git所做的事情。如果shell可以先扩展 glob,它将 - 例如,如果当前目录中匹配的文件*.F90

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

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

.在路径规范中使用:

git checkout origin/master -- ./*.F90
于 2021-03-04T17:34:50.053 回答