Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to use wildcards with git checkout?

What I would like to do is to checkout a single file or a set of files with a common name part like this

git checkout myBranch */myFile.md and

git checkout myBranch -- */*Test* (not sure about the '--' part)

instead of

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

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

I know there is some limited wildcard functionality for some git command like diff and add but have found nothing for checkout. Is there a way?

EDIT: I am using git 1.7.9.5 on Linux. A working combination of git and shell commmands would be acceptable as well.

like image 265
kostja Avatar asked Mar 01 '13 15:03

kostja


2 Answers

Git does deal with wildcards, using fnmatch(3). See the pathspec entry in Git glossary.

But to be sure that git can see the wildcards, they must be escaped otherwise your shell will expand them first. Typically, I use wildcards between single-quotes:

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

The wildcards are applied to the whole name, directories included.

As you can see in the documentation, the pathspec also allows magic signature which change how to interpret the pathspec. For example, you can have case-insensitive paths with icase (you can type ':(icase)*readme*' to find all your readme's).

I quote @bambams's comment here, in case you have problems in Windows:

This is not working for me in Windows with 2.8.1.windows.1 and I'm utilizing Git from the cmd.exe shell so no globbing built in. There is however a solution if you're in such a sorry state. Combine git diff --name-only and xargs to achieve your goal:

git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT>  
like image 67
coredump Avatar answered Sep 28 '22 01:09

coredump


Git does not deal with the wildcard, but your shell does.

Try this :

git checkout myBranch **/myFile.md 

and

git checkout myBranch  **/*Test* 

With the **, your shell will look for files in all the subdirectories starting from the current working directory.

like image 40
Intrepidd Avatar answered Sep 27 '22 23:09

Intrepidd