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

Могу ли я встроить следующий код оболочки 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'

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


person Seba Illingworth    schedule 20.08.2009    source источник


Ответы (5)


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

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

person u0b34a0f6ae    schedule 21.08.2009
comment
Тот. Отлично. Сначала я беспокоился, что случайно что-то запустил, так как я написал несколько сценариев оболочки для работы с git и дал им префикс 'git-', но моя оболочка (zsh) не заполняет их автоматически, поэтому я бы должны вводить их явно. И если мне нужно поведение автозаполнения, я могу объявить псевдоним git для его собственной подкоманды, что также является требованием, чтобы я сделал ссылку от скрипта на подкоманду явной. - person Jon Carter; 19.10.2015
comment
Ага, и это двоичный файл, который вам просто нужен: ! binary - person ; 11.03.2016
comment
У меня не работает, использование внутри псевдонима !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, так и без него. - person Hi-Angel; 04.02.2019

Чтобы запускать команды внутри псевдонима 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).)

person michael    schedule 21.02.2013
comment
git.wiki.kernel.org/index.php/Aliases# What.27s_new.3F неявно рекомендует использовать sh -c, так что вам не нужно беспокоиться о том, что такое оболочка входа пользователя. - person clacke; 30.06.2016
comment
синтаксис функции, который я предоставил, намеренно переносится на несколько оболочек (sh / ksh / bash / zsh) и будет быстрее, чем запуск подпроцесса. Я бы рекомендовал по-прежнему использовать синтаксис функции, если нет конкретной проблемы с переносимостью на конкретной платформе. - person michael; 25.05.2017
comment
Ваш комментарий вернул меня к этому ответу, и я, вероятно, воспользуюсь вашим путем. Это экономит один уровень котировок, и эти уровни и так уже достаточно безумны. :-) - person clacke; 26.05.2017
comment
Похоже, это хорошая статья о том, что вы делаете: atlassian.com/blog / git / advanced-git-aliases - person Gabriel Staples; 31.08.2018
comment
Примечание. Я разместил дополнительный вопрос по поводу этого ответа здесь: stackoverflow.com/questions/52123145/. Как заменить внутренние команды git, такие как git status, пользовательскими псевдонимами - person Gabriel Staples; 01.09.2018

Я не смог найти в документации, но если вы создадите скрипт «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)" 
}
person albfan    schedule 16.07.2011
comment
+1, думал, будет работать только из папки git libexec. спасибо, что поделился этим советом - person Olivier Refalo; 26.01.2012

Добавление этих двух строк в ваш .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 В частности, прочтите "расширенные псевдонимы с аргументами"

person David Claridge    schedule 21.08.2009
comment
git config --global сохранит ваши псевдонимы в $ HOME / .gitconfig, где (IMO) ими еще проще управлять; почти нет необходимости в привязке псевдонимов к конкретному репозиторию. (Конкретный репо входит в репо / .git / config) - person u0b34a0f6ae; 21.08.2009
comment
Спасибо, Дэвид, но для меня это просто не сработает - это или любой из вариантов отличной ссылки, которую вы включили. Может, надо было упомянуть, что я работаю в среде Windows? Спасибо, Кайзер, согласился, для меня это «глобально». - person Seba Illingworth; 21.08.2009
comment
В наши дни git.wiki.kernel.org/index.php/Aliases#Advanced - хорошее место для поиска. (ссылка git или cz перенаправляет туда, но в этом разделе, в частности, упоминается запуск сложных вещей с аргументами) - person clacke; 30.06.2016

(Из документации 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'
person Denian    schedule 05.12.2011
comment
какое отношение хуки имеют к конфигурации, расширениям и псевдонимам? - person Steve Buzonas; 27.07.2012