Как встроить скрипт 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'

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

Ответы на вопрос(5)

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

 Seba Illingworth21 авг. 2009 г., 03:48
Спасибо Дэвид, но это просто не сработает для меня - это или любой из вариантов отличной ссылки, которую вы включили. Может быть, я должен был упомянуть, что я работаю в среде Windows? Спасибо, Кайзер, согласился, это «глобально» для меня.
 clacke30 июн. 2016 г., 15:14
В эти дни,git.wiki.kernel.org/index.php/Aliases#Advanced это хорошее место для поиска. (ссылка git или cz перенаправляет туда, но в этом разделе, в частности, упоминается выполнение сложных вещей с аргументами)
 u0b34a0f6ae21 авг. 2009 г., 03:31
git config --global будет хранить ваши псевдонимы в $ HOME / .gitconfig, где (IMO) ими еще проще управлять; почти никакие псевдонимы не должны быть специфичными для репозитория. (Специфические репо идут в repo / .git / config)

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'
 Steve Buzonas27 июл. 2012 г., 06:46
какое отношение хуки имеют к конфигурации, расширениям и псевдонимам?

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 <[email protected](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)" 
}
 Olivier Refalo25 янв. 2012 г., 21:23
+1, думал, что это будет работать только из папки git libexec. спасибо, что поделились этим советом

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

$ 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 $16$quot;, второй для "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).)

 michael25 мая 2017 г., 01:27
предоставленный мною синтаксис функции преднамеренно переносим на несколько оболочек (sh / ksh / bash / zsh) и будет быстрее, чем запуск подпроцесса. Я бы порекомендовал по-прежнему использовать синтаксис функции, если только нет конкретной проблемы переносимости на конкретной платформе.
 clacke26 мая 2017 г., 01:07
Ваш комментарий вернул меня к этому ответу, и я, вероятно, собираюсь использовать ваш путь. Это экономит один уровень цитаты, и эти уровни достаточно сумасшедшие. :-)
 Gabriel Staples31 авг. 2018 г., 17:45
Это похоже на хорошую статью, описывающую то, что вы делаете:atlassian.com/blog/git/advanced-git-aliases
 clacke30 июн. 2016 г., 15:12
git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F неявно рекомендует использоватьsh -cТаким образом, вам не нужно беспокоиться о том, что такое оболочка входа пользователя.
 Gabriel Staples01 сент. 2018 г., 00:15
Примечание: я разместил дополнительный вопрос относительно этого ответа здесь:stackoverflow.com/questions/52123145/..., «Как заменить внутренние команды git, такие какgit statusс пользовательскими псевдонимами "
Решение Вопроса
git config --global alias.diffall '!sh diffall.sh'

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

 user33982711 мар. 2016 г., 15:51
Да, и это двоичный файл, вам просто нужен взрыв:! binary
 Hi-Angel04 февр. 2019 г., 11:11
Не работает для меня, используя внутри псевдоним!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 в начале.
 Jon Carter19 окт. 2015 г., 19:18
Это. Отлично. Сначала я волновался, что случайно что-то запустил, так как я написал несколько сценариев оболочки для работы с git и дал им префикс 'git-', но моя оболочка (zsh) не выполняет их автозаполнение, поэтому я бы должны вводить их явно. И если мне нужно поведение автозаполнения, я могу объявить псевдоним git для своей собственной подкоманды, что также является обязательным условием для явной связи скрипта с подкомандой.

Ваш ответ на вопрос