为什么运行命令作为git别名给出不同的结果?

时间:2012-01-12 09:36:27

标签: git

我有以下1-liner,我用它来看看谁可能是一个很好的候选人,可以提供一些代码帮助:

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

按提交顺序列出作者,它很简单,但工作正常。

但是当我将它添加到我的git配置中时,就像这样:

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

正在运行

git guru

从命令行运行它会产生不同的结果。

stuart@beavis(rp):~/git/apps$ git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr
710 Author: dave <dave@b2368a2b-315f-46b9-a0b0-05934f827f41>
415 Author: pete <pete@b2368a2b-315f-46b9-a0b0-05934f827f41>
402 Author: craig <craig@b2368a2b-315f-46b9-a0b0-05934f827f41>

与:相比:

stuart@beavis(rp):~/git/apps$ git guru
859 Author: craig <craig@b2368a2b-315f-46b9-a0b0-05934f827f41>
813 Author: paul <paul@b2368a2b-315f-46b9-a0b0-05934f827f41>
798 Author: dave <dave@b2368a2b-315f-46b9-a0b0-05934f827f41>

正如StefanNäwe所说,别名在你的存储库的根目录中运行,有没有办法在我所在的目录上运行命令,或指定?

3 个答案:

答案 0 :(得分:23)

  

有没有办法在我所在的目录上运行命令,或者   指定?

是的,有。当您运行git命令时,您的环境会获得一个GIT_PREFIX变量,其中包含相对路径的值(从顶层到执行git之前的路径),所以您需要的是git别名的前缀(运行shell命令和需要)右{pwd)与cd ${GIT_PREFIX:-.} &&

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

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

答案 1 :(得分:13)

使用 shell命令(即以!为前缀)的git的别名在工作目录(.git所在的位置)的顶层运行。简单别名(没有!)在当前目录中运行。

答案 2 :(得分:4)

看看你在做什么,你可能想要使用git shortlog -sn,因为这已经完成了相关任务。

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

pat@FROG /c/src/WiRE.git/wdf/src (pt/wdf)
$ git rev-parse  --show-cdup
../../

pat@FROG /c/src/WiRE.git/wdf/src (pt/wdf)
$ git config alias.cdup 'rev-parse --show-cdup'

pat@FROG /c/src/WiRE.git/wdf/src (pt/wdf)
$ git cdup
../../

pat@FROG /c/src/WiRE.git/wdf/src (pt/wdf)
$ git config alias.cdup2 '!git rev-parse --show-cdup'

pat@FROG /c/src/WiRE.git/wdf/src (pt/wdf)
$ git cdup2

pat@FROG /c/src/WiRE.git/wdf/src (pt/wdf)
$

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