有没有办法通过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
我知道有像diff
和add
一些混帐命令一些有限的通配符功能,但没有发现任何的checkout
。有没有办法?
编辑:我在Linux上使用git 1.7.9.5。 git和shell命令的工作组合也是可以接受的。
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-only
和xargs
来实现自己的目标:git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT>
Git不处理通配符,但是你的shell会处理这个通配符。
试试这个:
git checkout myBranch **/myFile.md
和
git checkout myBranch **/*Test*
随着**
,你的shell会寻找文件从当前工作目录开始的所有子目录。
其他答案都不为我工作,但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;
}
奇怪,'混帐diff'似乎并不支持通配符对我来说,虽然'git的add'和'commit'做。 – TankorSmash 2013-06-04 15:27:58