Як вбудувати скрипт 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'

Це зайве в одному напрямку. Якщо ви все одно збираєтеся додати 'diffall.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

(nb: фактичні результати можуть відрізнятися залежно від оболонки; я використовую це з 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. дякую, що поділилися цією порадою
Olivier Refalo

14

Додавання цих 2 рядків до вашого файлу .git / config має зробити трюк.

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

Редагувати: імовірно, версія git-config теж працює, але мені подобається зберігати свої псевдоніми у файлі налаштування для зручності управління.

У вікі git є приємна сторінка, яка дуже чітко пояснює псевдоніми: http://git.or.cz/gitwiki/Aliases Зокрема, читайте "розширені псевдоніми з аргументами"


git config --global зберігатиме ваші псевдоніми в $ HOME / .gitconfig, де (IMO) ними ще простіше керувати; майже жодні псевдоніми не повинні бути специфічними для сховища. (Специфічне репо переходить у repo / .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 / хуки?

Наприклад, якщо ви створюєте скрипт .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
яке відношення хуки мають до конфігурації, розширень та псевдонімів?
Стів Бузонас,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.