Git Alias-多个命令和参数


181

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

任何见识将不胜感激。


我的别名:git config --global alias.go'!git commit -a && git pull --rebase && git push && git status'。注意:使用简单的引号。
Marcus Becker

Answers:


156

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

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

1
不,不会。Git将转变git chs foogit checkout && git status foo
Lily Ballard

24
有趣的是,git实际上确实在shell别名中填充了位置变量。但是它仍然是无效的,因为它也将它们作为论点。echo $1 && echo done当使用参数'foo'调用别名时,将同时输出“ foo”和“ done foo”。
莉莉·巴拉德

7
首次调用时,前面的感叹号是git什么?
伊利亚·林恩

21
@ElijahLynn:在git别名中,前导!表示将整个内容传递给shell。否则,它假定您正在尝试运行另一个git命令并将其作为参数传递给git二进制文件。
莉莉·巴拉德

2
@Brondahl聪明。我建议;:而不是&& :。而且在Unix上也可以正常工作。
莉莉·巴拉德

80

这是针对Windows批处理/ msysgit bash的;可能无法在其他环境上使用。

正如Olivier Verdier和Lily Ballard所说

[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


9
&& :是金,使该解决方案适用于其他参数可能有问题的命令。
粘土

2
@Clay(或其他任何人)-有人可以向BASH挑战者解释什么&& :吗?
贾斯汀·摩根

6
@JustinMorgan &&表示如果前面的命令变为0(成功),则在&&之后运行命令。':'是冒号,是shell的内置命令,除了扩展参数和执行重定向并返回状态0外,它什么也没做。这是一些用法:1. a=123;$a错误,但a=123; : $a不执行。2. : > hello.txt清空hello.txt。3. if [ "$a" = "hello" ];then : ;fi运行正常,但没有':'的错误。就像pass在python中一样。4. : this is a comment冒号后面紧跟空格,就像#在注释行中一样。
ElpieKay

2
这是一个黑客... git应该接受多个命令模式
kchoi

1
感谢@ElpieKay的解释。我的一个项目的本地git别名是co = !git checkout public/compiled && git checkout $1,当我这样做时,git co master我会收到消息error: pathspec 'master' did not match any file(s) known to git.。我认为这个答案对我没有用,因为它提到的第一件事是Windows,而我使用的是Linux。但是你解释了为什么。
Tyler Collier

72

您可以定义一个外壳函数。

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

我在另一个stackoverflow页面上看到了此消息,但是我的cygwin终端说我尝试运行该函数时无法识别该函数。
斯特拉

@Stella:我在其中留下了一个结束语,这对配置文件语法没有用。确保您没有。
莉莉·巴拉德

1
哇...不幸的是,这全都是版本问题。我使用的是Git 1.7.3,但这些方法均无效。我更新到1.7.6,瞧,一切正常。多谢你们!
斯特拉

4
如果使用Windows,我认为您必须用双引号将shell函数定义括起来"
drzaus 2014年

4
使用参数(OSX),奥利维尔的答案对我不起作用。这工作得很好。
Ohad Schneider 2014年

25

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

我写了一篇文章,这里还有更多示例。


2
一个对此的改进将是添加!f() { : reset以从重置命令github.com/git/git/blob/master/contrib/completion/…中
用户

很好!该文章以什么许可证发布?我介意将其中的部分内容翻译成俄文的StackOverflow吗?
尼克·沃伦金

@NickVolynkin抱歉,回复晚。谢谢你,当然,继续吧:)
VitalyB

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

7
有什么!
AutonomousApps

我找不到doc,!但据我所知,默认情况下git会假设别名是git命令,因此t = status可以正常工作。但是,如果尝试t = git status这样做将不起作用(将显示未找到“ git”命令)。这样一!来,它就会告诉它像运行shell一样运行命令,并且通常在每个别名有多个git命令时都需要此命令,因此您可以使用t = !git status && git log它,例如它将起作用。
劳伦特

6

试试这个:

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

这样称呼它: git chs master


6

通过\在每行末尾附加多行git别名是可能的。

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

2
谢谢!实际上,使用"!git fetch --prune --all; git pull --rebase upstream master; git push origin master"别名没有问题。
Droogans 2014年

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命令,并且对结果没有影响。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.