Как встроить скрипт bash непосредственно в псевдоним git - PullRequest
75 голосов
/ 21 августа 2009

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

88 голосов
/ 21 августа 2009
git config --global alias.diffall '!sh diffall.sh'

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

32 голосов
/ 21 февраля 2013

Для запуска команд внутри псевдонима 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).)

23 голосов
/ 16 июля 2011

Я не смог найти в документации, но если вы создали скрипт "git- " в пути, вы можете вызвать его с "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)" 
}
13 голосов
/ 21 августа 2009

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

0 голосов
/ 05 декабря 2011

(из документации 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'
...