如何直接在git别名中embeddedbash脚本

我可以embedded下面的bash shell代码:

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

直接创build一个git别名:

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

这导致从我以前的问题/答案上,我把代码放到.sh文件,然后别名到文件:

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

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

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

这在一个方面是多余的。 如果你打算在你的$ PATH中join'diffall.sh',为什么不把它保存为`git-diffall',并且不要声明一个别名。 是的,“git diffall”会运行它。

我在文档中找不到,但是如果你在path中创build一个脚本“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 | ... $ 

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

甚至可以将自动完成添加到定义函数的新命令。 信息在这里

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

为了在git别名中运行命令,尤其是将parameter passing给这些命令,你可能需要创build一个临时函数,然后你立即调用:

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

在这个例子中,函数可能是你所需要的(并且对于你在一个单独的“语句”中可以做什么也是更灵活的)。 你可能会告诉对于这两个选项,剩下的参数git命令只是作为parameter passing给别名,不pipe它是“回声”还是“f”; 调用函数只需要使用参数,忽略没有明确使用的内容:

 $ git foo abc begin arg=a/b/end abc $ git foo2 abc 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。)

把这两行添加到你的.git / config文件中就可以了。

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

编辑:大概git-config版本也可以工作,但我喜欢在configuration文件中保留我的别名,以方便pipe理。

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

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

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

例如,如果您创build脚本.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'