Как заменить внутренние команды git, такие как `git status`, пользовательскими псевдонимами - PullRequest
0 голосов
/ 01 сентября 2018

Этот ответ учит, как выполнять пользовательские команды bash внутри псевдонимов git, и эта статья ( Одна странная уловка для мощных псевдонимов Git ) прекрасно этому учит. Тем не менее, это не работает, когда я псевдоним внутренних команд git. Как я могу заменить внутренние команды git пользовательскими скриптами?

Пример: у меня есть собственный скрипт на python: custom_script.py

print("hello")

В моем файле project_name/.git/config я добавляю этот псевдоним:

[alias]
    statuss = "!f() { \
        python3 custom_script.py && git status; \
    }; f"

Затем я запускаю git statuss, и она отлично работает! Я вижу распечатку "привет", а затем возвращаемые сообщения "git status".

ОДНАКО, если я переименую псевдоним с statuss на status, он больше не будет работать.

[alias]
    status = "!f() { \
        python3 custom_script.py && git status; \
    }; f"

Как я могу сделать это так, чтобы, просто позвонив git status, он сначала вызвал мой "custom_script.py" и , затем запустил git status?

Примечания:

  • В идеале, это будет работать в Windows, Mac или Linux, но Linux - это то, что меня больше всего волнует, так что решение только для Linux будет в порядке.
  • В идеале я хотел бы сделать это с помощью псевдонима git, но если мне нужно использовать псевдоним bash или другой трюк с Linux / компьютером, это лучше, чем ничего.

1 Ответ

0 голосов
/ 02 сентября 2018

Git не позволяет вам переопределять внутренние команды в псевдонимах, потому что это нарушит любой сценарий, который использует те внутренние команды, которые ожидали, что они будут работать как обычно. Это особенно важно, потому что некоторые команды Git являются сценариями оболочки, и переопределение этих команд может нарушить сценарии оболочки Git.

Вы можете переопределить это, написав скрипт оболочки с именем git, который вы поместите в каталог в $PATH, и это самый простой способ сделать это. Однако помните, что первый аргумент git не обязательно должен быть командой: git принимает большое количество параметров, предшествующих команде, таких как -c и -C, и ваш сценарий должен будет проанализировать их во избежание взлома любых других сценариев, которые могут вызывать git (которые могут, например, включать ваш редактор).

Так что, хотя это возможно, это очень сложно, и любое правильное решение будет довольно продолжительным (вот почему я не пытался сделать это здесь). Как правило, рекомендуемое решение - использовать псевдоним, который не отражает встроенное имя, что гораздо проще.

Однако, если вы хотите это только для интерактивного использования, в вашем $PATH можно создать сценарий с именем, скажем, git-wrapper, и сделать что-то подобное внутри:

#!/bin/sh

if [ "$1" = status ]
then
    python3 custom_script.py
fi
exec git "$@"

Затем вы можете запустить alias git=git-wrapper в вашем ~/.bash_profile или ~/.zshrc (но не ~/.bashrc или ~/.zshenv). Это повлияет только на те случаи, когда вы специально пишете git status, но не на сценарии. Это может быть достаточно для вас или нет.

...