Подтвердить что ты не робот

Есть ли способ использовать подстановочные знаки с помощью 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 команд вроде diff и add есть некоторая ограниченная функция подстановочных знаков, но ничего не найдено для checkout. Есть ли способ?

EDIT: Я использую git 1.7.9.5 для Linux. Также будет приемлемой рабочая комбинация git и командных команд.

4b9b3361

Ответ 1

Git работает с подстановочными знаками, используя fnmatch (3). См. описание пути в глоссарии Git.

Но чтобы быть уверенным, что git видит подстановочные знаки, они должны быть экранированы, иначе ваша оболочка расширит их в первую очередь. Обычно я использую символы подстановки между одинарными кавычками:

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

Подстановочные знаки применяются ко всему имени, включая каталоги.

Как вы можете видеть в документации, спецификация пути также позволяет использовать магическую подпись, которая изменяет способ интерпретации спецификации пути. Например, вы можете иметь нечувствительные к регистру пути с помощью icase (вы можете набрать ':(icase)*readme*', чтобы найти все ваши файлы readme).

Я цитирую комментарий @bambams здесь, если у вас есть проблемы в Windows:

Это не работает для меня в Windows с 2.8.1.windows.1, и я использование Git из оболочки cmd.exe, поэтому нет встроенных глобализаций. Однако решение, если вы находитесь в таком плачевном состоянии. Объедините git diff --name-only и xargs, чтобы достичь своей цели:

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

Ответ 2

Git не относится к шаблону, но ваша оболочка делает.

Попробуйте следующее:

git checkout myBranch **/myFile.md

и

git checkout myBranch  **/*Test*

С помощью ** ваша оболочка будет искать файлы во всех подкаталогах, начиная с текущего рабочего каталога.

Ответ 3

Powershell

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

gci генерирует список всех файлов, соответствующих критериям (*test*), затем направляет его в Resolve-Path, чтобы получить относительный путь. Наконец, сплющенный (@) список имен файлов передается по вызову git (выполняется один раз для каждого найденного файла).

Ответ 4

Ни один из других ответов не работал у меня, но работал над комментарием бамбэмов. Я превратил его в функцию bash, которая принимает два аргумента. Использование:

gitcheckout myBranch '* file *'

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;
}