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

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

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

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

который не работает. Если что-то вроде этого будет работать.

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

So

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

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

Ответ 4

Мне удалось создать многострочные и довольно сложные псевдонимы 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"

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

Ответ 5

[alias]
chs = !git branch && git status

Ответ 6

Попробуйте следующее:

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

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

Ответ 7

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

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

Ответ 8

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

[alias]
  test = !git echo $*

Тогда do 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

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