为什么运行命令作为git别名会产生不同的结果?

问题描述:

我有以下1班轮,我用它来看看谁可能是帮助一个很好的候选人与代码peice的:为什么运行命令作为git别名会产生不同的结果?

git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr 

其中列出了在提交订单的作者,它的原油,但它的工作原理确定。

当我把它添加到我的混帐配置然而,像这样:

[alias] 
    guru=!git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr 

运行

git guru 

给出不同的结果,从命令行运行它。

[email protected](rp):~/git/apps$ git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr 
710 Author: dave <[email protected]> 
415 Author: pete <[email protected]> 
402 Author: craig <[email protected]> 

相比:

[email protected](rp):~/git/apps$ git guru 
859 Author: craig <[email protected]> 
813 Author: paul <[email protected]> 
798 Author: dave <[email protected]> 

正如斯蒂芬·纳韦下面的注释,别名版本库的根目录中运行,有没有什么办法上运行我在目录中的命令,或指定?

+1

看起来像你想'git的shortlog -sn'的方式。 – patthoyts 2012-01-12 12:30:11

+0

@patthoyts,添加作为答案,它会得到一个蜱! – 2012-01-12 16:58:18

看着你在做什么,你可能想用git shortlog -sn来代替,因为这样做已经有问题了。

git别名不会全部运行在顶层。如git config manual中所述“请注意,将从存储库的*目录执行shell命令,该目录可能不一定是当前目录。”所以只有shell命令可以在顶层运行。如果你只是别名一个git子命令,它将运行在当前位置。以下会话日志演示了这一点:

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git rev-parse --show-cdup 
../../ 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git config alias.cdup 'rev-parse --show-cdup' 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git cdup 
../../ 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git config alias.cdup2 '!git rev-parse --show-cdup' 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ git cdup2 

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf) 
$ 

您的示例使用以'git'开头的别名命令。如果我尝试设置'git rev-parse --show-cdup'作为别名,它会返回一个错误,指出'git不是git命令',所以我怀疑你实际上也有一个感叹号,因此将它作为shell命令运行,因此从顶层运行。

GIT中的别名使用在工作目录(.git生活在哪里)的顶层运行壳命令(即,通过!前缀)。简单的别名(没有!)在当前目录下运行。

+0

谢谢Stefan,这回答了我的原始问题,我现在已经开始希望在相同的情况下让其他人更有用。 – 2012-01-12 23:52:32

+3

这是一个相当不直观的Git行为。有谁知道如何在当前目录中运行别名?或者,如果当前目录在env var或其他东西中可用,以便在运行之前别名可以“cd”回正确的位置? – 2013-11-20 17:04:35

+0

@JimStewart参见上面的Andrei Neculau的回答,它显示了如何做到这一点:) – waldyrious 2016-04-04 18:45:59

有没有什么办法可以在我进入的目录上运行命令,或者 指定?

是的,有。当你运行一个git命令时,你的环境得到一个GIT_PREFIX变量与相对路径的值(从执行git之前的顶层到路径),所以你需要的是你的git别名(运行shell命令并且需要正确的pwd)与cd ${GIT_PREFIX:-.} &&

简单测试,将它添加到您的~/.gitconfig

[alias] p = !pwd && cd ${GIT_PREFIX:-.} && pwd

+2

有关$ {GIT_PREFIX: - 。}'语法的解释,请参考:http://*.com/a/16753536/ 79111。 – 2016-08-11 13:31:23