Как встроить сценарий bash прямо в псевдоним git


82

Могу ли я встроить следующий код оболочки bash:

for name in $(git diff --name-only $1); do git difftool $1 $name & done

непосредственно при создании псевдонима git:

git config --global alias.diffall ***my-bash-code-here***

Это следует из моего предыдущего вопроса / ответа по SO, где я поместил код в файл .sh, а затем присвоил ему псевдоним:

git config --global alias.diffall '!sh diffall.sh'

Но в нескончаемом поиске простоты должен быть способ пропустить файл и вставить код прямо в псевдоним? Не могу понять формат ...

Ответы:


95
git config --global alias.diffall '!sh diffall.sh'

С одной стороны, это избыточно. Если вы все равно собираетесь добавить «difffall.sh» в свой $ PATH, почему бы не сохранить его как «git-diffall» и не объявлять псевдоним. Да, его запустит "git diffall".


1
Тот. Отлично. Сначала я волновался, что случайно что-то запустил, так как я написал несколько сценариев оболочки для работы с git и дал им префикс git-, но моя оболочка (zsh) не заполняет их автоматически, поэтому я бы должны вводить их явно. И если мне нужно поведение автозаполнения, я могу объявить псевдоним git для его собственной подкоманды, что также является требованием, чтобы я явно указывал ссылку от скрипта на подкоманду.
Джон Картер,

1
Ага, и это двоичный файл, который вам просто нужен:! binary

1
У меня не работает, использование псевдонима внутри !sh git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')приводит к /usr/lib/git-core/git: /usr/lib/git-core/git: cannot execute binary file. Пробовал сначала как с так и без sh.
Hi-Angel

36

Чтобы запускать команды внутри псевдонима git и, в частности, передавать аргументы этим командам, вам, вероятно, придется создать временную функцию, которую вы затем немедленно вызовете:

$ vim ~/.gitconfig
...
[alias]
    # compare:
    foo = "! echo begin arg=$1/$2/end"
    foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f"

В этом примере функция, вероятно, то, что вам нужно (и она более гибкая в отношении того, что вы можете сделать в одном «операторе»); и вы, вероятно, можете сказать, что для обоих вариантов оставшиеся аргументы команды git просто передаются как аргументы псевдониму, независимо от того, является ли он «echo» или «f»; вызов функции просто использует аргументы, игнорируя то, что явно не используется:

$ git foo a b c
begin arg=a/b/end a b c

$ git foo2 a b c
begin arg=a/b/end

Другой пример (перечисляет все псевдонимы на основе совпадающего шаблона) (примечание: вы можете повторно использовать одно и то же имя функции «f ()» во всем .gitconfig):

[alias]
    alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f"

Первый возвращает псевдоним только для «foo $», второй для «foo. *»:

$ git alias foo
alias.foo ! echo begin arg=$1/$2/end

$ git alias 'foo.*'
alias.foo ! echo begin arg=$1/$2/end
alias.foo2 !f() { echo begin arg=$1/$2/end; }; f

(Примечание: фактические результаты могут отличаться в зависимости от оболочки; я использую это с bash в Linux, Unix и Cygwin (Windows).)


git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F неявно рекомендует использовать sh -c, так что вам не нужно беспокоиться о том, что такое оболочка входа пользователя.
clacke

Синтаксис функции, который я предоставил, намеренно переносится на несколько оболочек (sh / ksh / bash / zsh) и будет быстрее, чем запуск подпроцесса. Я бы рекомендовал по-прежнему использовать синтаксис функции, если нет особых проблем с переносимостью на конкретной платформе.
Майкл

Ваш комментарий вернул меня к этому ответу, и я, вероятно, воспользуюсь вашим путем. Это экономит один уровень котировок, и эти уровни и так достаточно безумны. :-)
clacke

Похоже, это хорошая статья, описывающая то, что вы делаете: atlassian.com/blog/git/advanced-git-aliases
Габриэль Стейплз

Примечание. Я разместил дополнительный вопрос по поводу этого ответа здесь: stackoverflow.com/questions/52123145/… . «Как заменить внутренние команды git, например git status, пользовательскими псевдонимами»
Габриэль Стейплс,

24

Мне не удалось найти в документации, но если вы создадите скрипт «git- <name>» в пути, вы можете вызвать его с «git name» в своем репо.

Видеть:

$ cd ~/bin
$ echo "echo I love this log:
>pwd
>git log --graph  --summary --decorate --all" > git-logg
$ chmod +x git-logg
$ cd /path/to/your/repo
$ git logg
I love this log:
/path/to/your/repo
* commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch)
| Author: myself <my@Laptop.(none)>
| Date:   Fri Apr 1 16:47:20 2011 +0200
| 
|     would have been better not to do it at all
| 
...
$

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

Более того, вы можете добавить автозаполнение к этой новой команде, определяющей функцию. Информация здесь

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}

+1, думал, будет работать только из папки git libexec. Спасибо, что поделился этим
советом

14

Добавление этих двух строк в ваш .git / config файл должно помочь.

[alias]
    diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done'

Изменить: предположительно, версия git-config тоже работает, но мне нравится хранить свои псевдонимы в файле конфигурации для удобства управления.

В git wiki есть хорошая страница, которая очень четко объясняет псевдонимы: http://git.or.cz/gitwiki/Aliases В частности, прочтите «расширенные псевдонимы с аргументами»


git config --global сохранит ваши псевдонимы в $ HOME / .gitconfig, где (IMO) ими еще проще управлять; почти нет необходимости в привязке псевдонимов к конкретному репозиторию. (Конкретные репо войдут в репо / .git / config)
u0b34a0f6ae

Спасибо, Дэвид, но у меня это просто не сработает - это или любой из вариантов отличной ссылки, которую вы включили. Может, надо было упомянуть, что я работаю в среде Windows? Спасибо, Кайзер, согласился, для меня это «глобально».
Себа Иллингворт,

В наши дни git.wiki.kernel.org/index.php/Aliases#Advanced - хорошее место для поиска. (ссылка git или cz перенаправляет туда, но в этом разделе, в частности, упоминается запуск сложных вещей с аргументами)
clacke

-4

(Из документации ProGit: http://progit.org/book/ch7-3.html )

Вы пробовали добавить скрипт в .git / hooks?

Например, если вы создаете скрипт .git / hooks / post-checkout:

#!/bin/bash

echo "This is run after a 'git checkout'"

а затем запустите команду:

$ git checkout master
Switched to branch 'master'
This is run after a 'git checkout'

3
какое отношение хуки имеют к конфигурации, расширениям и псевдонимам?
Steve Buzonas,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.