有没有办法使用git checkout的通配符?

kos*_*tja 52 git wildcard git-checkout

我想要做的是签出一个文件或一组具有这样的通用名称部分的文件

git checkout myBranch */myFile.md

git checkout myBranch -- */*Test* (不确定' - '部分)

代替

git checkout myBranch src/main/java/a/deep/package/structure/myFile.md

git checkout myBranch src/test/java/a/deep/package/structure/TestOne.java
git checkout myBranch src/test/java/a/deep/package/structure/TestTwo.java
git checkout myBranch src/test/java/a/deep/package/structure/resources/TestData.sql

我知道某些git命令有一些有限的通配符功能diff,add但是没有找到任何内容checkout.有办法吗?

编辑:我在Linux上使用git 1.7.9.5.git和shell命令的工作组合也是可以接受的.

cor*_*ump 61

Git的处理通配符,使用的fnmatch(3) .请参阅Git词汇表中pathspec条目.

但是为了确保git可以看到通配符,它​​们必须被转义,否则你的shell将首先展开它们.通常,我在单引号之间使用通配符:

git checkout myBranch -- '*/myFile.md'
Run Code Online (Sandbox Code Playgroud)

通配符应用于整个名称,包括目录.

正如您在文档中看到的那样,pathspec还允许使用魔术签名来更改如何解释pathspec.例如,您可以使用带有icase的不区分大小写的路径(您可以键入':(icase)*readme*'以查找所有自述文件).

我在这里引用@ bambams的评论,以防你在Windows中遇到问题:

这对我来说不适用于带有2.8.1.windows.1的Windows,而我正在使用cmd.exe shell中的Git,因此没有内置的全局内容.如果你处于这样一个令人遗憾的状态,有一个解决方案.结合git diff --name-onlyxargs实现您的目标:

git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> 
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说不适用于带有2.8.1.windows.1的Windows,而我正在使用cmd.exe shell中的Git,因此没有内置的全局内容.如果你处于这样一个令人遗憾的状态,有一个解决方案.结合git diff --name-only和xargs来实现你的目标:`git diff --name-only <COMMIT> - <GLOB> ... | xargs git checkout <COMMIT> - (6认同)
  • 但是没有办法通配分支名称,例如`git checkout my*`? (3认同)
  • 虽然来晚了一点,但无疑是正确的。谢谢@coredump,是时候移动绿色复选标记了:) (2认同)

Int*_*idd 21

Git不处理通配符,但你的shell确实如此.

试试这个 :

git checkout myBranch **/myFile.md
Run Code Online (Sandbox Code Playgroud)

git checkout myBranch  **/*Test*
Run Code Online (Sandbox Code Playgroud)

使用**,您的shell将从当前工作目录开始查找所有子目录中的文件.

  • 请注意,此_only_会考虑shell看到的文件,例如签出的文件.它确实_not_签出了尚未存在的文件. (8认同)
  • 哪个壳?我正在使用Cygwin bash,这对我不起作用. (3认同)