Git Alias - 多个命令和参数

Ste*_*lla 170 git alias sh git-alias

我正在尝试创建一个使用多个Git命令和位置参数的别名.每个都有Stackoverflow页面,两者都显得非常明显,但我遇到了麻烦.

例如,我想切换到分支foo并执行状态.所以在我看来.gitconfig,我有:

  [alias] 
     chs = !sh -c 'git checkout $0 && git status'
Run Code Online (Sandbox Code Playgroud)

这不起作用.而这样的事情会起作用.

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

echoes = !sh -c 'echo hi && echo bye'
Run Code Online (Sandbox Code Playgroud)

任何见解将不胜感激.

Oli*_*ier 146

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

[alias] chs = !git checkout $1 && git status
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,git实际上确实填充了shell别名中的位置变量.但它仍然被打破,因为它也将它们视为争论.`echo $ 1 && echo done`的别名,当使用参数'foo'调用时,将同时输出"foo"和"done foo". (23认同)
  • @ElijahLynn:在一个git别名中,一个前导的`!`意味着将整个东西传递给shell.否则,它假设您正在尝试运行另一个git命令并将其作为参数传递给`git`二进制文件. (19认同)
  • 在第一次调用`git`时,前面的感叹号是什么? (7认同)
  • 不,不会。Git 会将 `git chs foo` 转换为 `git checkout && git status foo` (2认同)
  • 当我尝试这样做时,我收到路径规范错误(“$1”与 git 已知的任何文件不匹配) (2认同)
  • 哇...不幸的是,这都是版本问题。我使用的是 Git 1.7.3,但这些方法都不起作用。我更新到 1.7.6,瞧,一切正常。谢谢你们! (2认同)
  • 评论也作为答案添加,如果我应该删除一个帖子或另一个帖子,请大声喊叫。在 Windows 环境(命令行或 msysgit bash)中,您可以将 `&& :` 附加到您的别名中,这将消耗参数的额外插入(将其转换为位置标记,不会打印。)不知道这个或类似的东西是否可以在其他环境中工作。 (2认同)
  • @Brondahl Clever.我建议使用`;:`而不是`&&:`.这也适用于unix. (2认同)

Lil*_*ard 70

您可以定义shell函数.

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

  • 如果使用Windows,我认为你必须使用双引号```来包围shell函数定义 (4认同)
  • Olivier的回答对我使用参数(OSX)不起作用.这非常有效. (4认同)
  • 哇...不幸的是,这都是版本问题。我使用的是 Git 1.7.3,但这些方法都不起作用。我更新到 1.7.6,瞧,一切正常。谢谢你们! (2认同)

Rei*_*l-- 63

这针对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 && :
Run Code Online (Sandbox Code Playgroud)

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

  • @JustinMorgan && 表示如果前一个命令变为 0(成功),则在 && 之后运行该命令。':',冒号,是一个 shell 内置命令,除了扩展参数和执行重定向并返回状态 0 之外什么都不做。这里有一些用法: 1. `a=123;$a` 错误,但是 `a= 123; : $a` 没有。2. `:> hello.txt` 清空 hello.txt。3. `if [ "$a" = "hello" ];then : ;fi` 运行正常但没有 ':' 出现错误。这就像python中的`pass`。4. `:这是一条注释`,冒号后跟空格在注释行中用作`#`。 (9认同)
  • `&&:`是黄金,使这个解决方案适用于额外参数有问题的命令. (6认同)
  • @Clay(或其他任何人)-有人可以向 BASH 挑战者解释 `&&:` 的作用吗? (5认同)
  • 这是一个黑客... git应该接受多个命令模式 (2认同)

Vit*_*lyB 23

我能够创建多行和非常复杂的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"
Run Code Online (Sandbox Code Playgroud)

我写了一篇文章,并在这里有更多的例子.

  • 对此的一个改进就是添加`!f(){:reset`以从重置命令获得完成命令https://github.com/git/git/blob/master/contrib/completion/git-completion.bash#L25 (2认同)

Fra*_*ace 21

[alias]
chs = !git branch && git status
Run Code Online (Sandbox Code Playgroud)

  • 我找不到“!”的文档,但据我所知,默认情况下 git 会假设别名是 git 命令,因此“t = status”将起作用。但是,如果您尝试“t = git status”,它将无法工作(会说“git”命令未找到)。因此,当 `!` 出现时,它会告诉它像 shell 一样运行命令,通常当每个别名有多个 git 命令时您需要这个,因此您可以使用 `t = !git status && git log` 例如,它会起作用。 (3认同)
  • 什么是`!`? (2认同)
  • `!`将前面的arg视为外部命令. (2认同)
  • 如果别名扩展**带有感叹号**,它将被视为**shell命令**。https://git-scm.com/docs/git-config (2认同)

Eng*_*hly 13

[alias]
      chs = !git checkout && git status
      ac = !git add . && git commit -m 
Run Code Online (Sandbox Code Playgroud)

什么是 !?

如果别名扩展以感叹号为前缀,它将被视为 shell 命令。git config 别名中的感叹号是什么意思?

从 .gitconfig 文件调用别名

git chs
git ac "write_your_commit_message" 
Run Code Online (Sandbox Code Playgroud)

别名对于在 git 中添加和提交更有用,你可以做得更快 Gif 显示更多数据


bro*_*son 6

试试这个:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"
Run Code Online (Sandbox Code Playgroud)

像这样称呼它: git chs master


小智 5

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

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我实际上对别名使用`“!git fetch --prune --all; git pull --rebase上游主服务器; git push origin master”没有问题。 (2认同)

Ben*_*ins 5

这里的问题是位置参数似乎被发送到 shell 命令两次(从 gi​​t 1.9.2 开始)。要明白我的意思,请尝试以下操作:

[alias]
  test = !git echo $*
Run Code Online (Sandbox Code Playgroud)

然后做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
Run Code Online (Sandbox Code Playgroud)

解决这个问题的一种方法是

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null
Run Code Online (Sandbox Code Playgroud)

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