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

我想做的是检出单个文件或一组文件,它们具有这样的通用名称

git checkout myBranch */myFile.md

diff(不确定'-'部分)

代替

diff

diff
add
checkout

我知道某些git命令(例如diffadd)有一些有限的通配符功能,但对checkout却一无所获。有没有办法?

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

kostja asked 2020-01-20T09:47:08Z
4个解决方案
60 votes

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

但是要确保git可以看到通配符,必须将其转义,否则您的shell将首先对其进行扩展。 通常,我在单引号之间使用通配符:

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

通配符将应用于全名,包括目录。

如您在文档中所见,pathspec还允许魔术签名,这些魔术签名更改了解释pathspec的方式。 例如,您可以使用icase设置不区分大小写的路径(可以键入git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> 来查找所有自述文件)。

如果您在Windows中遇到问题,我在这里引用@bambams的评论:

在Windows 2.8.1.windows.1中,这对我不起作用,并且   利用cmd.exe外壳程序中的Git,因此没有内置的glob。   但是,如果您处于这种遗憾的状态,则可以采用一种解决方案。 结合git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> xargs实现您的目标:

git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> 
coredump answered 2020-01-20T09:47:56Z
21 votes

Git不会处理通配符,但是您的Shell会处理。

尝试这个 :

git checkout myBranch **/myFile.md

git checkout myBranch  **/*Test*

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

Intrepidd answered 2020-01-20T09:48:29Z
1 votes

电源外壳

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

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

9Rune5 answered 2020-01-20T09:48:54Z
0 votes

没有其他答案对我有用,但是bambams评论有用。 我将其设置为接受两个参数的bash函数。用法:

git checkout 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;
}
Klik answered 2020-01-20T09:49:18Z
translate from https://stackoverflow.com:/questions/15160978/is-there-a-way-to-use-wildcards-with-git-checkout