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

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

问题描述:

我想什么做的是签一个文件或一个共同的名字的一部分这样有没有办法通过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

我知道有像diffadd一些混帐命令一些有限的通配符功能,但没有发现任何的checkout。有没有办法?

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

+0

奇怪,'混帐diff'似乎并不支持通配符对我来说,虽然'git的add'和'commit'做。 – TankorSmash 2013-06-04 15:27:58

Git 确实处理通配符,使用fnmatch(3)。请参阅pathspec条目Git glossary

但要确保git可以看到通配符,它​​们必须被转义,否则你的shell将首先扩展它们。通常情况下,我用单引号之间的通配符:

git checkout myBranch -- '*/myFile.md' 

通配符应用到整个名称,目录包括在内。

正如您在文档中看到的,pathspec还允许魔术签名,它改变了如何解释pathspec。例如,您可以通过输入icase(您可以输入':(icase)*readme*'查找所有自述文件)来区分不区分大小写的路径。

我引用@ bambams的评论在这里,如果你在Windows问题:

这不是2.8.1.windows.1为我工作在Windows和我 利用的Git从cmd.exe外壳,所以没有内置的globbing。然而,如果你处于这样一个不幸的状态,有一个解决方案 。结合git diff --name-onlyxargs来实现自己的目标:

git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> 
+1

晚会有点迟,但无疑是正确的。谢谢@coredump,时间移动绿色复选标记:) – kostja 2015-10-24 14:34:50

+0

@kostja是的,绝对迟到;-)谢谢 – coredump 2015-10-25 16:06:53

+1

但没有办法通配符的分支名称,例如'git结帐我*'? – dumbledad 2016-03-04 14:03:21

Git不处理通配符,但是你的shell会处理这个通配符。

试试这个:

git checkout myBranch **/myFile.md 

git checkout myBranch **/*Test* 

随着**,你的shell会寻找文件从当前工作目录开始的所有子目录。

+0

按广告形式工作。谢谢Intrepidd – kostja 2013-03-01 16:01:49

+6

请注意,此_only_会考虑shell看到的文件,例如检出文件。它不会检出尚不存在的文件。 – vonbrand 2013-03-02 04:20:46

+0

@vonbrand:任何方式来处理提交中但目前不在文件系统中的文件? – Gauthier 2013-08-27 12:27:38

其他答案都不为我工作,但bambams评论工作。我将它变成了一个接受两个参数的bash函数。 用法:

gitcheckout myBranch '*文件*'

gitcheckout() 
{ 
    GIT_DIR=$(git rev-parse --git-dir 2>/dev/null); 
    pushd .; 
    cd $GIT_DIR/../; 
    git diff --name-only $1 -- $2 | xargs git checkout $1 --; 
    popd; 
}