Как вставить bash script непосредственно внутри псевдонима 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'
Но в бесконечном квесте для простоты должен быть способ пропустить файл и вставить код непосредственно в псевдоним? Я не могу понять формат...
Ответы
Ответ 1
git config --global alias.diffall '!sh diffall.sh'
Это избыточно в одном направлении. Если вы все равно добавите 'diffall.sh' в свой $PATH, почему бы не сохранить его как 'git -diffall' и избавить себя от объявления псевдонима. Да, "git diffall" запустит его.
Ответ 2
Чтобы запускать команды внутри псевдонима git и, в частности, передавать аргументы этим командам, вам, вероятно, придется создать временную функцию, которую вы тут же вызываете:
$ vim ~/.gitconfig
...
[alias]
# compare:
foo = "! echo begin arg=$1/$2/end"
foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f"
В этом примере функция, вероятно, вам нужна (и также более гибкая в отношении того, что вы можете сделать в одном "заявлении" ); и вы, вероятно, можете сказать, что для обоих вариантов остальные аргументы команды git просто передаются как args для псевдонима, независимо от того, является ли это "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
(nb: фактические результаты могут варьироваться в зависимости от оболочки, я использую это с помощью bash в Linux, Unix и Cygwin (Windows).)
Ответ 3
Я не мог найти в документации, но если вы создадите путь script "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 <[email protected](none)>
| Date: Fri Apr 1 16:47:20 2011 +0200
|
| would have been better not to do it at all
|
...
$
Итак, вы можете написать любой псевдоним, который вам нравится, с этим (довольно неясным) способом.
Более того, вы можете добавить автозаполнение к этой новой команде, определяющей функцию. Info здесь
$ _git_logg ()
{
# you can return anything here for the autocompletion for example all the branches
__gitcomp_nl "$(__git_refs)"
}
Ответ 4
Добавление этих двух строк в ваш файл .git/config должно сделать трюк.
[alias]
diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done'
Изменить: возможно, версия git -config тоже работает, но мне нравится сохранять свои псевдонимы в файле конфигурации для удобства управления.
В wiki git есть хорошая страница, которая очень четко объясняет псевдонимы: http://git.or.cz/gitwiki/Aliases В частности, прочитайте" расширенные псевдонимы с аргументы
Ответ 5
(Из документации ProGit: http://progit.org/book/ch7-3.html)
Вы пытались добавить script в .git/hooks?
Например, если вы создаете script.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'