如何将bash脚本直接嵌入git别名中

时间:2009-08-20 23:42:09

标签: git bash shell alias

我可以嵌入以下bash shell代码:

for name in $(git diff --name-only $1); do git difftool $1 $name & done

直接创建一个git别名:

git config --global alias.diffall ***my-bash-code-here***

这是从我的previous question/answer开始的,我把代码放到.sh文件中,然后别名到文件:

git config --global alias.diffall '!sh diffall.sh'

但是,在对简单性的永无止境的追求中,必须有一种跳过文件并将代码直接插入别名的方法吗?我无法弄清楚格式...

5 个答案:

答案 0 :(得分:87)

git config --global alias.diffall '!sh diffall.sh'

这在某种程度上是多余的。如果你打算在你的$ PATH中添加'diffall.sh',为什么不把它保存为'git-diffall',并保存自己不要声明别名。是的,“git diffall”将运行它。

答案 1 :(得分:32)

要在git别名中运行命令,特别是将参数传递给这些命令,您可能必须创建一个临时函数,然后立即调用:

$ vim ~/.gitconfig
...
[alias]
    # compare:
    foo = "! echo begin arg=$1/$2/end"
    foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f"

在这个例子中,函数可能就是你需要的(并且在单个“语句”中你可以做的更灵活);并且您可以告诉对于这两个选项,git命令的剩余args只是作为args传递给别名,无论它是“echo”还是“f”;调用该函数只会消耗args,忽略未明确使用的内容:

$ git foo a b c
begin arg=a/b/end a b c

$ git foo2 a b c
begin arg=a/b/end

另一个例子(基于匹配模式列出所有别名)(注意:你可以在整个.gitconfig中继续使用相同的函数名“f()”):

[alias]
    alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f"

第一个返回“foo $”的别名,第二个返回“foo。*”:

$ git alias foo
alias.foo ! echo begin arg=$1/$2/end

$ git alias 'foo.*'
alias.foo ! echo begin arg=$1/$2/end
alias.foo2 !f() { echo begin arg=$1/$2/end; }; f

(nb:实际结果可能因shell而异;我在Linux,Unix和Cygwin(Windows)上使用bash。)

答案 2 :(得分:23)

我在文档中找不到,但是如果你创建了一个脚本“git-< name>”在路径中,您可以在回购邮件中使用“git name”调用它。

请参阅:

$ cd ~/bin
$ echo "echo I love this log:
>pwd
>git log --graph  --summary --decorate --all" > git-logg
$ chmod +x git-logg
$ cd /path/to/your/repo
$ git logg
I love this log:
/path/to/your/repo
* commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch)
| Author: myself <my@Laptop.(none)>
| Date:   Fri Apr 1 16:47:20 2011 +0200
| 
|     would have been better not to do it at all
| 
...
$

所以,你可以用这个(相当模糊)的方式写任何你喜欢的别名。

您可以为定义函数的新命令添加自动完成功能。信息here

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}

答案 3 :(得分:13)

将这两行添加到.git / config文件应该可以解决问题。

[alias]
    diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done'

编辑:大概git-config版本也可以,但我喜欢将我的别名保存在配置文件中以便于管理。

git wiki上有一个很好的页面可以非常清楚地解释别名:http://git.or.cz/gitwiki/Aliases特别是,阅读'带参数的高级别名'

答案 4 :(得分:-3)

(来自ProGit文档:http://progit.org/book/ch7-3.html

您是否尝试在.git / hooks中添加脚本?

例如,如果您创建脚本.git / hooks / post-checkout:

#!/bin/bash

echo "This is run after a 'git checkout'"

然后运行命令:

$ git checkout master
Switched to branch 'master'
This is run after a 'git checkout'