С помощью !!получить доступ к истории bash внутри псевдонима Git - PullRequest
0 голосов
/ 18 июня 2019

Я хочу создать псевдоним, который запускает git stash, а затем выполняет команду, которая была до него.

Это было бы полезно, если git не позволяет запустить команду с несохраненными изменениями, такими как извлечение, ребазинг и т. Д.

Что я пробовал:

s = "!git stash && fc -s

s = "!bash -c \"git stash && !!\""

Ни одна из вышеперечисленных работ. Похоже, что в первом из них git создает подоболочку для запуска этой команды, так как fc выводит no command found. Второй аналогичен, но здесь я явно создаю подоболочку, и она явно не работает, без доступа к истории.

Есть ли способ обойти это? Вполне возможно, что это можно сделать с помощью псевдонима bash, но я бы предпочел сделать это с помощью псевдонима git.

Ответы [ 2 ]

3 голосов
/ 18 июня 2019

Вполне вероятно, что это можно сделать с помощью псевдонима bash,

Да, это будет просто и надежно.

, но я бы предпочелсделать это с помощью псевдонима git.

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

Во-первых, вам нужно передать историю.Сделайте так, чтобы ваша оболочка записывала его в файл истории после каждой команды, добавив это в .bashrc:

PROMPT_COMMAND='history -a'

Затем вы можете добавить свой псевдоним git.Необходимо

  1. работать с Bash, поскольку система sh может не поддерживать расширение истории
  2. включить расширение истории и истории
  3. прочитать файл истории
  4. использовать расширение истории в отдельном блоке синтаксического анализа (например, после перевода строки, вне составной команды):

В общем:

s = "!bash -c 'set -Ho history; history -r ~/.bash_history\ngit stash && !-1'"

Обратите внимание, что этоМы выполним последнюю команду, выполненную независимо от экземпляра bash , поэтому, если вы используете несколько окон tmux / screen / Terminal, она не обязательно будет запускать последнюю команду в вашей текущей оболочке.

1 голос
/ 18 июня 2019

Вы не можете использовать псевдоним git для доступа к истории Bash (или любым другим данным оболочки), так как команда после восклицательного знака не запускается как подоболочка.Git - это внешняя команда, поэтому все ее дочерние процессы также не являются подоболочками.

Подробнее

Это можно подтвердить, установив псевдоним git foo = !echo $$ $BASHPID и сравнив его с текущей оболочкой:

$ echo $$ $BASHPID
11461 11461
$ git foo
25437

В моем случае это даже не запуск Bash.После некоторого тестирования я думаю, что он работает / bin / sh, что для меня является Dash, так как я использую Ubuntu.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...