Чтобы оформить любой файл с «частичным / путем» в его пути + именем из HEAD:

git checkout *partial/path*

Чтобы извлекать файлы из определенных коммитов (здесь -- необязательно):

git checkout abcde -- full/path/to/my/file full/path/to/another/file

Парадоксально, следующая команда не Кассовые файлы , соответствующие pathspec в совершении предписанного в технических заданиях:

git checkout abcde -- *partial/path*

Вместо этого это приводит к error: pathspec '*partial/path*' did not match any file(s) known to git.

Мой вопрос: возможно ли использовать pathspec для извлечения нескольких файлов, используя pathspec от определенного коммита?


Примечание: я понимаю, что git checkout branch file , вероятно, совершенно отличается от git checkout pathspec (и также полностью отличается от git checkout branch), что может объяснить, почему pathspec здесь не работает.

Примечание: следующий псевдоним только частично решает проблему:

[alias] ccps = "!f() { git ls-files $2 | xargs -I {} git checkout $1 -- \"{}\"; }; f"

Это происходит сбой, когда один или несколько файлов были добавлены или удалены в соответствии с указанием пути между текущим коммитом и целевым коммитом.


ОБНОВЛЕНИЕ: следующий псевдоним (вроде) делает то, что я хочу:

[alias] ccps = "!f() { git ls-tree -r --name-only $1 | grep $2 | xargs -I {} git checkout $1 -- {}; }; f"

Проблемы с этим решением:

  • grep $2 отличается от pathspec (не будет работать с . and .. and *).
  • Это довольно медленно (потребовалось ~ 5 секунд для последовательного git checkout 57 файлов, возвращаемых из grep).

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

1 ответ1

0

Подстановочные знаки обычно расширяются вашей оболочкой против живой файловой системы Чтобы передать их напрямую в Git, либо экранируйте, либо заключайте в кавычки спецификацию пути, то есть \*partial/path\* или "*partial/path*" . Таким образом, расширение будет выполняться самим git и против данного коммита.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .