【问题标题】:Why does running command as git alias gives different results?为什么以 git 别名运行命令会给出不同的结果?
【发布时间】:2012-01-12 09:36:26
【问题描述】:

我有以下 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>

正如下面 Stefan Näwe 所指出的,别名在存储库的根目录中运行,有什么方法可以在我所在的目录上运行命令,或者指定?

【问题讨论】:

  • 顺便说一句,你想要git shortlog -sn
  • @patthoyts,将其添加为答案,它会打勾!

标签: git


【解决方案1】:

有什么方法可以在我所在的目录上运行命令,或者 指定?

是的,有。当您运行 git 命令时,您的环境会获得一个带有相对路径值的 GIT_PREFIX 变量(从顶层到执行 git 之前的路径),因此您需要为您的 git 别名添加前缀(运行 shell 命令并需要正确的密码)与cd ${GIT_PREFIX:-.} &amp;&amp;

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 感谢 Stefan,这回答了我最初的问题,我现在已经修改,希望它对处于相同情况的其他人更有用。
  • 这是一个相当不直观的 Git 行为。有谁知道如何在当前目录中运行别名?或者如果当前目录在 env var 或其他东西中可用,以便别名可以在运行之前 cd 回到正确的位置?
  • @JimStewart 见上面 Andrei Neculau 的回答,它展示了如何做到这一点:)
【解决方案3】:

看看你在做什么,你可能想改用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不是git命令'所以我怀疑你实际上也有一个感叹号,因此将它作为shell命令运行,因此从顶层运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2012-06-09
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2021-08-26
    相关资源
    最近更新 更多