Есть ли способ использовать подстановочные знаки с помощью 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 и командных команд.
Ответы
Ответ 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;
}