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

Stu*_*haw 13 git

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

git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr
Run Code Online (Sandbox Code Playgroud)

根据提交的顺序列出作者,它很粗糙,但它可以正常工作.

当我将它添加到我的git配置中时,如下所示:

[alias]
    guru=!git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr
Run Code Online (Sandbox Code Playgroud)

赛跑

git guru
Run Code Online (Sandbox Code Playgroud)

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

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

相比:

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

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

And*_*lau 23

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

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

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

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

  • 有关`$ {GIT_PREFIX: - .}`语法的说明,请参阅:http://stackoverflow.com/a/16753536/79111. (2认同)

Ste*_*äwe 13

使用shell命令(即前缀为!)的git的别名在工作目录(.git生命中)的顶层运行.简单别名(不!)在当前目录下运行.

  • 这是一个相当不直观的Git行为.有谁知道如何在当前目录中运行别名?或者,如果当前目录在env var中可用,或者某个别名可以在运行之前"cd"回到正确的位置? (3认同)

pat*_*yts 4

看看您正在做什么,您可能想使用它,git shortlog -sn因为这已经完成了有问题的任务。

git 别名并不都在顶层运行。正如git config 手册中所述“请注意,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)
$
Run Code Online (Sandbox Code Playgroud)

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