【问题标题】:Setting git default flags on commands在命令上设置 git 默认标志
【发布时间】:2011-01-30 19:56:36
【问题描述】:

我想知道是否有办法为 git 命令默认设置标志。具体来说,我想设置--abbrev-commit标志,以便在执行git log时,我想执行git log --abbrev-commit

与问题“is there any way to set a flag by default for a git command?”不同,显然没有将 --abbrev-commit 添加到 git log 的配置标志。此外,git手册指出我无法创建别名:"To avoid confusion and troubles with script usage, aliases that hide existing git commands are ignored"

我的第三个选择是在我的 .gitconfig 文件中创建一个新的别名,例如 glog=log --abbrev-commit。但我宁愿不要用新命令发明我自己的 DSL。

有没有其他方法可以实现默认设置abbrev-commit标志??

【问题讨论】:

  • 从 git 1.7.6 开始,有一个标志可以控制这种行为。请参阅下面@underrun 的答案。

标签: git logging


【解决方案1】:

VonC 在他的回答中已经暗示了一个外壳包装器;这是我对这种包装器的 Bash 实现。如果你把这个例如进入您的.bashrc,您的交互式shell 将支持覆盖Git 内置命令以及大写别名。

# Git supports aliases defined in .gitconfig, but you cannot override Git
# builtins (e.g. "git log") by putting an executable "git-log" somewhere in the
# PATH. Also, git aliases are case-insensitive, but case can be useful to create
# a negated command (gf = grep --files-with-matches; gF = grep
# --files-without-match). As a workaround, translate "X" to "-x".
git()
{
    typeset gitAlias="git-$1"
    if type ${BASH_VERSION:+-t} "$gitAlias" >/dev/null 2>&1; then
        shift
        eval $gitAlias '"$@"'
    elif [ "$1" = "${1#-}" ] && expr "$1" : '.*[[:upper:]]' >/dev/null; then
        # Translate "X" to "-x" to enable aliases with uppercase letters.
    translatedAlias=$(echo "$1" | sed -e 's/[[:upper:]]/-\l\0/g')
        shift
        command git "$translatedAlias" "$@"
    else
        command git "$@"
    fi
}

然后,您可以通过将名为 git-log 的脚本放入 PATH 的某处来覆盖 git log

#!/bin/sh
exec git log --abbrev-commit "$@"

【讨论】:

    【解决方案2】:

    我喜欢git log --oneline 格式。 要将其设为默认值,请使用

    git config --global format.pretty oneline

    信用:https://willi.am/blog/2015/02/19/customize-your-git-log-format/

    【讨论】:

    • git tag 有类似的东西吗?
    • 回答了我自己的问题。有:git config --global tag.sort version:refname
    【解决方案3】:

    我有一个类似的问题(Git 命令的许多默认选项都是愚蠢的)。这是我的方法。在您的路径上创建一个名为“grit”(或其他)的脚本,如下所示:

    #!/bin/bash
    cmd=$1
    shift 1
    if [ "$cmd" = "" ]; then
      git
    elif [ $cmd = "log" ]; then
      git log --abbrev-commit $@
    elif [ $cmd = "branch" ]; then
      git branch -v $@
    elif [ $cmd = "remote" ]; then
      git remote -v $@
    else
      git $cmd $@
    fi
    

    非常易于阅读和维护,以防您需要与 Bash 非专家分享。

    【讨论】:

    • 你真的想让“git remote blah”调用“git branch blah”吗?我正在使用它的变体,我将 git 放在路径的前面,然后在我的脚本中显式调用 /usr/bin/git 。是的,这可能会破坏一些东西。
    • 我喜欢这个并做了两个额外的调整。我把它变成了一个 bash 函数,并通过添加第一行来将其命名为 git 以获取真正的命令路径:thegit=`/usr/bin/which git`。我还添加了一个选项,可以在 git x log ...:if [ "$cmd" = "x" ]; then; $thegit $@ 等命令之前使用 x 取消覆盖。
    【解决方案4】:

    git 中没有通用机制来设置命令的默认参数。

    您可以使用git aliases 定义带有所需参数的新命令:

    git config alias.lg "log --oneline"
    

    然后你可以运行git lg

    一些命令也有配置设置来改变它们的行为。

    【讨论】:

    • 我想避免创建自己的语法,所以我更喜欢不使用git lggit log的解决方案
    • 非常重要的区别是我不想在我的系统上引入“Jespers git 语法”。我希望我(和其他使用我的机器的人)使用通用命令。此外,这将使我在其他机器上的工作更快:我不担心不小心输入“git lg”并得到“未找到”错误
    • 我接受这个答案作为一个有效的解决方案。尽管这是我最初在问题中描述的最佳选择,但它似乎是目前最好的解决方案。
    • 如果其他人在使用您的机器并输入 git log 您的预期解决方案将意味着他们将获得他们没有预料到的结果。
    • 重新定义标准别名会破坏脚本。
    【解决方案5】:

    从 git 版本 1.7.6 开始,git config 获得了一个 log.abbrevCommit 选项,可以设置为 true。因此,答案是至少升级到 1.7.6(目前为 1.7.11.4)并使用:

    git config --global log.abbrevCommit true
    

    【讨论】:

    • 不知道有oneline的选项吗?
    • 我接受这个答案。很高兴看到 Git 添加了这个配置,因为我差不多四年前写了这个问题。
    • 所有这些神秘选项的来源在哪里?
    • 有人知道图表的默认标志吗?我在@xaxxon 链接的页面中找不到它..
    • @myol,您应该使用git config --helpgit help config 来获取与您的安装相匹配的文档
    【解决方案6】:

    您可以使用自定义格式让git log默认模仿--abbrev-commit

    git config format.pretty "format:%h %s"
    

    【讨论】:

    • 太好了,这无疑是最好的答案。
    • 您也可以在格式化时使用颜色:"%C(yellow)%h%Creset %s" 会像 git log --oneline 一样显示颜色。
    • 现在问一个简单的问题:如果您发现这很有用并且可以准确回答问题,为什么不将其标记为正确?
    • 如果你不想记住晦涩难懂的别名,并且喜欢一直使用“git log”,这会更好。
    • 这对我来说是最好的答案。 log.abbrevCommit 设置影响了我不喜欢的其他更详细的格式。此外,使用%C(auto)%h %s 获得具有自动着色功能的正常单行格式。我使用git config --global format.pretty "%C(auto)%h %d %s" 是因为我想将装饰的单行作为我的“默认”
    【解决方案7】:

    我们使用的每个实用程序(svn、maven、git、...)总是封装在 .bat 中(在 Windows 上,或 .sh 在 Unix 上),以便为我们的开发人员提供一个目录来添加到他们的路径中。

    如果 git 被封装在一个包装脚本中,那么……一切皆有可能。

    但这仍然是与用户设置相关联的解决方案,而不是与 Git 本身或 git 存储库相关联。

    【讨论】:

    • 所以你的意思是我应该能够通过向我的 .bash_profile 添加别名来实现它?
    • @Jesper:就是这个想法,因为你的包装器 git.bat 将能够检测到你想要执行的 Git 命令,并可以添加它想要的任何选项。
    猜你喜欢
    • 2023-03-14
    • 2010-11-19
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2021-12-30
    • 2014-06-08
    相关资源
    最近更新 更多