Git Alias - 多个命令和参数

时间:2011-09-23 20:01:27

标签: git sh alias git-alias

我正在尝试创建一个使用多个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'

任何见解都将受到赞赏。

10 个答案:

答案 0 :(得分:139)

这将起作用(使用zsh和bash测试):

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

答案 1 :(得分:64)

您可以定义shell函数。

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

答案 2 :(得分:57)

这针对Windows批处理/ msysgit bash;可能不适用于其他环境。

正如Olivier Verdier和Kevin Ballard所说的那样

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

几乎可以正常工作,但却给出了虚假的额外插入......

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

但是如果你将&& :添加到别名的末尾,那么伪参数将被用于位置标记。

所以

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

给出正确的输出...... git chs demo -> git checkout demo && git status

答案 3 :(得分:20)

我能够创建多行且非常复杂的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"

我写了一篇帖子,还有一些例子here

答案 4 :(得分:15)

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

答案 5 :(得分:6)

试试这个:

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

这样称呼:git chs master

答案 6 :(得分:4)

通过在每行的末尾附加\,可以使用多行git别名。

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

答案 7 :(得分:3)

这里的问题是位置参数似乎被发送到shell命令两次(从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

这将消耗额外的位置参数,因为它应用于最后一个echo命令并且对结果没有影响。

答案 8 :(得分:1)

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

是什么! ?

<块引用>

如果别名扩展以感叹号为前缀,它将被视为一个shell命令。 What does the exclamation mark mean in git config alias?

从 .gitconfig 文件调用别名

git chs
git ac "write_your_commit_message" 

alias 对于在 git 中添加和提交更有用,你可以做得更快 Gif show more datails

答案 9 :(得分:0)

一个想要尝试使用不同别名的人的示例。

将其放入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