Расширение функциональности Git

Мне было интересно, есть ли простой способ расширить команды Git.

Поэтому я мог бы создавать команды вроде:

git my-custom-made-extension --my-options <my-other-arguments>

В идеальном мире я бы смог сделать это на любом языке, который мне нравится, и я бы смог легко добавить свои пользовательские расширения в любую среду разработки.

Скажем, что-то вроде поддержки плагинов в Vim?

Ответ 1

Как вы можете видеть в исходном коде в execv_dashed_external, если вы сделаете команду git-my-custom-made-extension, то git будет псевдоним:

  • git my-custom-made-extension ...git-my-custom-made-extension ...
  • git help my-custom-made-extensionman git-my-custom-made-extension

Нет ничего особенного в том, что "расширение git". Просто создайте программу, как обычно, и убедитесь, что имя начинается с git-.

Ответ 2

Примеры реальной жизни

Оглядываясь, есть много проектов, которые расширяют командную строку Git:

  • git-wtf (написанный в Ruby) использует brew или ручную установку, чтобы поместить исполняемый файл в /usr/bin (или был он /usr/local?). И похоже, что Git имеет механизм, который знает, что когда вы пишете git wtf, он действительно ищет любой script в PATH с именем git-wtf.
  • git-annex (написанный в haskell) имеет более сложный аромат. Но даже если он использует Cabal для его установки (и имеет длинный список зависимостей, если у вас его нет), похоже, что он использует тот же базовый принцип, что и git -wtf. (Git найдет его в исполняемом пути при написании git annex)
  • git-flow (написанный в оболочке) использует brew/macport/apt-get/wget + bash для установки. И, опять же, он, похоже, использует тот же механизм.

Решение (?)

Так что, безусловно, можно написать свой собственный script, а затем сделать его доступным, разместив его на любых путях, перечисленных в вашей переменной PATH.

Но насколько я знаю, есть несколько недостатков...

Известные проблемы

Документация

На самом деле вы не расширяете Git, поэтому некоторые команды не работают:

$ git help wtf
No manual entry for git-wtf
$ git wtf --help
No manual entry for git-wtf
$ git wtf -h # the only command which works...
Usage: git wtf [branch+] [options]
...

Я не пробовал это на git -annex, поэтому они могли обойти эту проблему, но git -flow и git -wtf следуют этому поведению.

ИЗМЕНИТЬ: git help назад к страницам man, так что эта точка не имеет отношения к ней (спасибо Eric).

Процесс установки

Установка с помощью Brew, macports и apt-get поразительны. Но нет общепринятого способа добавления функций в Git. Более конкретно, у вас нет независимого от платформы способа установки ваших "плагинов". Может быть, make выполнит трюк, но даже тогда вам придется самому написать установку script.