设置 git 命令默认标志

96

我想知道是否有一种方法可以默认设置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手册指出,我不能创建一个别名:“为避免脚本使用时出现混淆和麻烦,忽略隐藏现有git命令的别名”

我的第三个选项是在我的.gitconfig文件中发明一个新的别名,如glog=log --abbrev-commit。但我不想发明自己的DSL和新命令。

是否有另一种方法可以实现默认设置abbrev-commit标志?


1
从git 1.7.6版本开始,有一个标志来控制这种行为。请参阅下面@underrun的答案。 - slacy
截至2022年3月的Git 2.35.1版本,仍然没有一种方法可以设置常见Git命令的默认标志(除了围绕git的shell包装器[1][2])。我希望Git在.gitconfig中提供一个选项,以将命令指向别名。或者,一个新的配置类别/组“prepend”,在其中可以定义类似于prepend.log = "--stat --find-renames --stat-count=5"; prepend.diff = "blahblahblah"的内容。 - PotatoFarmer
8个回答

69

自从 git 版本 1.7.6 起,git config 工具增加了 log.abbrevCommit 选项,可以设置为 true。因此,答案是升级至至少 1.7.6(截至本文撰写时的当前版本为 1.7.11.4),并使用以下命令:

git config --global log.abbrevCommit true

6
有没有单行选项? - Zaz
1
我接受这个答案。很高兴看到Git添加了这个配置,因为我写这个问题已经将近四年了。 - Jesper Rønn-Jensen
3
所有这些神秘选项的源头在哪里? - xaxxon
有人知道图形的默认标志吗?我在@xaxxon链接的页面上找不到它。 - myol
1
@Zaz,对于一行的使用,请使用 git config --global format.pretty oneline https://dev59.com/fnE95IYBdhLWcg3wApHl#50875528 - Kirill Osenkov
显示剩余2条评论

52

您可以使用自定义格式,使得 git log 默认模仿 --abbrev-commit 功能:

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

1
现在有一个快速的问题:如果您发现这很有用,并且确切地回答了问题,为什么不将其标记为正确呢? - igorsantos07
1
如果您不想记住晦涩难懂的别名,而是更喜欢始终使用“git log”,那么这种方法会更好。 - Shyam Habarakada
@JesperRønn-Jensen 我认为这应该是正确的答案,而不是之前被接受的答案。 - Shyam Habarakada
@JesperRønn-Jensen 我没有注意到问题中的git版本,但我认为你的意思是你拥有(过去拥有?)的git版本不支持format.pretty配置吗? - Shyam Habarakada
1
这对我来说是最好的答案。log.abbrevCommit设置影响了其他更冗长的格式,而我不喜欢。此外,使用%C(auto)%h %s可以获得带有自动着色的普通单行格式。我使用了git config --global format.pretty "%C(auto)%h %d %s",因为我想要装饰的单行作为我的“默认”格式。 - davenpcj
显示剩余3条评论

41

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

您可以使用 git别名来定义一个带有所需参数的新命令:

git config alias.lg "log --oneline"

接着你可以运行git lg命令。

有些命令还有配置设置可以改变它们的行为。


14
我希望你能够翻译以下内容:我想避免创建自己的语法,所以我更倾向于使用不需要 git lg 而是 git log 的解决方案。 - Jesper Rønn-Jensen
51
非常重要的区别是,我不想在我的系统上引入“Jespers git语法”。我希望我自己(和其他使用我的机器的人)使用通用命令。这样做还可以让我在其他机器上更快地工作:我不用担心意外地键入“git lg”而出现“未找到”的错误提示。 - Jesper Rønn-Jensen
1
我接受这个答案作为有效的解决方案。尽管这是我在问题中最初描述的最佳选择,但它似乎是目前最好的解决方案。 - Jesper Rønn-Jensen
22
如果其他人在使用你的计算机并键入了“git log”,按照您的解决方案,他们将得到意料之外的结果。 - Abizern
2
重新定义标准别名可能会破坏脚本。 - justintime
显示剩余3条评论

16

有没有类似于 git tag 的东西? - Tom
1
回答了自己的问题。有:git config --global tag.sort version:refname - Tom

10
VonC已经在他的回答中提到了一个shell包装器;这是我自己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 "$@"

8

我有一个类似的问题(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 branch blah"来执行"git remote blah"吗?我使用了一个变种,将git放在路径的前面,然后在我的脚本中显式地调用/usr/bin/git。是的,这可能会破坏某些东西。 - LovesTha
1
我喜欢这个并进行了两个额外的调整。我将其制作成了一个bash函数,并通过添加第一行来获取真实的命令路径,使其被命名为gitthegit=\/usr/bin/which git`。我还添加了一个选项,可以在命令前加上x来取消覆盖,例如git x log ...if [ "$cmd" = "x" ]; then; $thegit $@`。 - Joshua Goldberg
1
我会将这个包装器与git别名配对 - 包装器将调用别名,例如 git mycustomlog(而不是特定的自定义命令)。这允许Git自定义存在于全局git配置中,并且可以根据项目配置进行自定义,甚至更多。 - PotatoFarmer

1

Steve BennettPotatoFarmer 上面的想法混合在一起,但完全动态,无需脚本更新,同时通过利用git的“别名”功能和我们自己的约定允许每个项目的标志: 任何以“my-”为前缀的都会得到我们的处理,否则就直接传递。我将其命名为“~/bin/my_git”,并在.bashrc中使用别名来代替git (alias git="$HOME/bin/my_git"):

#!/bin/bash
set -euo pipefail

cmd=${1:-}
shift 1

if [ "$cmd" = "" ]; then
    git
# Ask git itself if we have a "my-<cmd>" version to prefer
elif git config --list | egrep -q "^alias\.my-$cmd="; then
    git my-$cmd $@
else
    git $cmd $@
fi

当然,您可以根据需要在~/.gitconfig和/或您的项目的.git/config文件中匹配条目:

[alias]
    my-merge = merge --no-commit
    my-log = log --name-status

0
我们使用的每个实用程序(svn,maven,git,...)始终封装在 .bat 文件中(在 Windows 上),或 .sh 文件(在 Unix 上),以便为我们的开发人员提供一个要添加到其路径中的目录。
如果 git 封装在包装器脚本中,那么......一切皆有可能。
但这仍然是与用户设置相关的解决方案,而不是与 Git 或 git 存储库本身相关。

那么你的意思是我应该通过将别名添加到我的.bash_profile文件中来实现它? - Jesper Rønn-Jensen
@Jesper:这就是想法,因为您的包装器 git.bat 将能够检测您想要执行的 Git 命令,并且可以添加任何选项。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接