Вопрос или проблема
ПРИМЕЧАНИЕ: Я планирую ответить на свой собственный вопрос.
Вот последняя команда, которую я выполнил в командной строке:
git co head -- a/path/to/a/file.ts
Я хочу выполнить это несколько раз, но с разными путями файлов для последнего аргумента/параметра. Эта страница объясняет расширение истории, и я думаю, что ответ, который я ищу, содержится в этом подразделе, но там отсутствуют примеры.
Используя расширение истории, как бы я повторил предыдущую команду с другим путем файла? Например, как бы я выполнил:
git co head -- a/path/to/another/different-file.ts
Это, вероятно, дублирующий вопрос, но мне не удалось найти нужный ответ. Эти посты выглядят так, будто могут содержать ответ, но это не так:
Предположим, что последняя команда была git co head -- a/path/to/a/file.ts
, вот как использовать расширение истории, чтобы выполнить git co head -- a/path/to/another/different-file.ts
:
!:0- a/path/to/another/different-file.ts
Документация по дизайнерам слов предоставляет кусочки головоломки, но вам нужно собрать их вместе. Вот разбивка каждого символа расширения истории:
-
!: Ссылается на предыдущую команду
-
:: Следующие символы будут относиться к дизайнерам слов (предыдущей команды).
-
0: Ссылается на первое слово (
git
) -
-: Ссылается на диапазон после первого слова. Если следующим символом было бы другое число, это расширялось бы до этого диапазона слов (из предыдущей команды). Но, если последним символом является -, следующее число по умолчанию будет относиться к предпоследнему слову.
Например, если в расширенной команде было 5 слов,
0-
относится к первым 4.
На самом деле существует более короткий способ записать это. Вы можете опустить 0: !:-
эквивалентно вышеуказанному, потому что при отсутствии 3-го параметра он по умолчанию принимает значение 0.
ПРИМЕЧАНИЕ: У меня включена команда bind Space:magic-space
, поэтому клавиша пробела развернула !:0-
до git co head --
в моем терминале. Я не думаю, что это должно повлиять на ответ, но дайте знать, если я ошибаюсь.
Ответ или решение
Используя расширение истории в Bash, можно легко повторить последнюю команду с другим последним словом. В вашем случае, последней выполненной командой было:
git co head -- a/path/to/a/file.ts
Для того чтобы выполнить эту команду с другим путем к файлу, например a/path/to/another/different-file.ts
, можно воспользоваться следующим синтаксисом:
!:0- a/path/to/another/different-file.ts
Вот объяснение компонентов этой команды:
!
: Этот символ ссылается на последнюю выполненную команду.:
: Этот символ указывает, что дальнейшие символы будут рассматривать обозначения слов (word designators) из предыдущей команды.0
: Относится к первому слову предыдущей команды (в данном случае этоgit
).-
: Указывает на диапазон после первого слова. Если следующий символ после-
будет числом, то это будет расширять диапазон. Однако, если последний символ это-
, то по умолчанию он ссылается на предпоследнее слово команды.
Таким образом, !:0-
фактически ссылается на все слова, начиная с git
и заканчивая предпоследним словом перед последним (то есть на head --
). После этого вы можете добавить новое слово, которое заменяет последнее слово предыдущей команды.
На самом деле, ваш запрос можно сократить. Если вы уберете 0
, команда будет выглядеть так:
!:- a/path/to/another/different-file.ts
Поскольку третий параметр по умолчанию равен 0
, это приведет к тому же результату.
Также упомяну, что если у вас настроено bind Space:magic-space
, то нажатие клавиши пробела вами расширяет !:0-
до git co head --
, что не должно влиять на саму команду.
Таким образом, для выполнения команды с другим файлом просто замените последний аргумент:
git co head -- a/path/to/another/different-file.ts
Надеюсь, это поможет вам!