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

时间:2013-03-01 15:16:31

标签: 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命令(如diffadd)存在一些有限的通配符功能,但却找不到checkout的任何内容。有办法吗?

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

8 个答案:

答案 0 :(得分:57)

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

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

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

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

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

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

  

对于使用2.8.1.windows.1和我的Windows的Windows,这不适合我   利用cmd.exe shell中的Git,所以没有内置的globbing。有   但如果你处于这种令人遗憾的状态,这是一个解决方案。结合git diff --name-onlyxargs来实现您的目标:

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

答案 1 :(得分:19)

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

试试这个:

git checkout myBranch **/myFile.md

git checkout myBranch  **/*Test*

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

答案 2 :(得分:1)

Powershell

@(gci -Recurse *test* | Resolve-Path -Relative) | %{git checkout mybranch -- $_)

gci生成一个符合条件(*test*)的所有文件的列表,然后将其通过管道传递到Resolve-Path以获得相对路径。最后,将扁平化的文件名列表(@)输送到git调用中(每个找到的文件执行一次)。

答案 3 :(得分:1)

带有xargs的Windows git bash

git difftool myBranch --name-only *.java | xargs git checkout myBranch

答案 4 :(得分:0)

其他答案都没有对我有用,但bambams评论有效。我把它变成了一个接受两个args的bash函数。 用法:

gitcheckout myBranch&#39; *文件*&#39;

select

答案 5 :(得分:0)

如果您有gitignore或未跟踪的文件,并且想在git checkout中使用通配符,则可能会给您带来问题,解决方案可能是:

git ls-files '*/myFile.md' | tr '\n' '\0' | xargs -0 -L1 -I '$' git checkout -- '$'

答案 6 :(得分:0)

知道git从第3个字符返回分支列表名称后,就可以切换到通过[mask]定义的所需分支:

BRANCH_NAME=$(git branch --list | grep [mask] | cut -c3-)
git checkout ${BRANCH_NAME}

答案 7 :(得分:0)

对我来说,任务是检出以一种模式命名的多个文件:

  • ./a/b/c/FirstTest.java
  • .d/e/f/SecondTest.java
  • ./g/h/i/ThirdTest.java

我使用了以下bash命令:

# 1. Find files named after "*Test.java" pattern.
# 2. Execute checkout command on every found file.

find . -name "*Test.java" -exec git checkout master {} \;

首先,您可以使用简单的find测试echo命令,该命令仅打印给定的文本(在我们的例子中,{}将被shell替换为当前找到的文件名) :

find . -name "*Test.java" -exec echo {} \;