Git Alias ​​- несколько команд и параметров

Я пытаюсь создать псевдоним, который использует как несколько команд Git, так и позиционные параметры. Для каждого есть страницы Stackru, и кажется, что делать то и другое мучительно очевидно, но у меня возникли проблемы.

В качестве примера я хочу перейти на ветку foo и выполнить статус. Так по моему .gitconfig, Я имею:

  [alias] 
     chs = !sh -c 'git checkout $0 && git status'

который не работает. В то время как что-то подобное будет работать.

chs = !sh -c 'git checkout $0'

echoes = !sh -c 'echo hi && echo bye'

Любое понимание будет оценено.

12 ответов

Это будет работать (протестировано с zsh и bash):

[alias] chs = !git checkout $1 && git status

Это предназначается для Windows batch / msysgit bash; может не работать в других средах.

Как сказали Оливье Вердиер и Кевин Баллард

[alias] chs = !git checkout $1 && git status

почти работает, но дает ложную дополнительную вставку аргумента...

git chs demo -> git checkout demo && git status demo

Но если вы добавите && : до конца вашего псевдонима, тогда ложный аргумент будет использован в теге location.

Так

[alias] chs = !git checkout $1 && git status && :

дает правильный вывод...git chs demo -> git checkout demo && git status

Вы можете определить функцию оболочки.

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"

Мне удалось создать многострочные и довольно сложные псевдонимы git. Они отлично работают на Windows, но я предполагаю, что они будут работать и в других местах, например:

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

Я написал пост и у меня есть еще несколько примеров здесь.

[alias]
chs = !git branch && git status
      [alias]
      chs = !git checkout & git status
      ac = !git add . & git commit -m 

что ! ?

Если расширение псевдонима предваряется восклицательным знаком, оно будет рассматриваться как команда оболочки. Что означает восклицательный знак в псевдониме git config?

Для вызова псевдонима из файла .gitconfig

      git chs
git ac "write_your_commit_message" 

псевдоним более полезен для добавления и фиксации в git, вы можете сделать быстрее

Можно добавить многострочный псевдоним git, добавив \ в конце каждой строки.

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "

Попробуй это:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

Назовите это так: git chs master

Проблема здесь в том, что позиционные параметры, похоже, отправляются в команду оболочки дважды (начиная с git 1.9.2). Чтобы понять, что я имею в виду, попробуйте это:

[alias]
  test = !git echo $*

Затем сделать git test this is my testing string, Вы должны наблюдать следующий вывод (последние две строки отредактированы здесь для ясности):

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

Один из способов обойти это было бы

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null

Это будет использовать дополнительный позиционный параметр при его применении к последней команде эха и не повлияет на результаты.

Пример для людей, которые хотят попробовать, что делают разные псевдонимы.

Поместив это в раздел псевдонимов конфигурационного файла GIT (например, ~/.gitconfig):


    [alias]
        a0 = "!echo $*"
        a1 = "!echo $* #"
        a2 = "!f () { echo \"$*\"; }; f "
        a3 = "!f () { echo \"$*\"; }; f #"
        a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
        a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
        a6 = "!f () { echo \"$*\"; }; f \"$1\" #"

А затем выполните эту команду:


    cat ~/.gitconfig | grep --extended-regexp -- '(a[0-9])|(alias)' ; \
    echo "" ; \
    export CMD ; \
    for I in {0..6} ; \
    do \
        CMD="a""${I}" ; \
        echo -n "Executing alias.${CMD} = " ; \
        git config --global alias."${CMD}" ; \
        git $CMD 'hoi daar' en nu? ; \
        git $CMD hoi daar en nu? ; \
        echo "" ; \
    done ; \
    unset CMD ;

Должен дать это как результат:


    [alias]
       a0 = "!echo $*"
       a1 = "!echo $* #"
       a2 = "!f () { echo \"$*\"; }; f "
       a3 = "!f () { echo \"$*\"; }; f #"
       a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
       a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
       a6 = "!f () { echo \"$*\"; }; f \"$1\" #"
    
    Executing alias.a0 = !echo $*
    hoi daar en nu? hoi daar en nu?
    hoi daar en nu? hoi daar en nu?
    
    Executing alias.a1 = !echo $* #
    hoi daar en nu?
    hoi daar en nu?
    
    Executing alias.a2 = !f () { echo "$*"; }; f 
    hoi daar en nu?
    hoi daar en nu?
    
    Executing alias.a3 = !f () { echo "$*"; }; f #
    
    
    
    Executing alias.a4 = !f () { echo "$*"; }; f "$*" #
    hoi daar en nu?
    hoi daar en nu?
    
    Executing alias.a5 = !f () { echo "$*"; }; f "$@" #
    hoi daar en nu?
    hoi daar en nu?
    
    Executing alias.a6 = !f () { echo "$*"; }; f "$1" #
    hoi daar
    hoi

Это старый пост, но никто не предоставил то, что я считаю самым простым решением. Это работает в моем CLI на основе *nix, ваш пробег может отличаться.

      [alias]
    chs = "!git checkout $1; git status"

Простая точка с запятой (;) — это все, что вам нужно для запуска нескольких команд git.

Поскольку у Лили Баллард есть хороший ответ с помощью функции оболочки, он выглядит лучше, когда мы передаем все аргументы-псевдонимы:

      [alias] chs = "!f(){ git checkout \"${@:1}\" && git status; };f"
Другие вопросы по тегам