在命令上设置git default标志


88

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

与问题“ 默认情况下是否可以为git命令设置标志吗? ”不同,显然没有用于将--abbrev-commit添加到git log的配置标志。此外,git手册指出我无法创建别名:“为避免混淆和脚本使用麻烦,将忽略隐藏现有git命令的别名”

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

还有另一种方法可以实现,以便abbrev-commit默认情况下设置标志吗?


1
从git 1.7.6开始,有一个标志来控制此行为。请参阅下面的@underrun答案。
slacy

Answers:


58

从git版本1.7.6开始,git config获得了log.abbrevCommit选项,可以将其设置为true。因此,答案至少是升级到1.7.6(截至撰写本文时,当前是1.7.11.4)并使用:

git config --global log.abbrevCommit true

2
不要以为单行有选择吗?
2013年

1
我接受这个答案。自从我四年前写这个问题以来,很高兴看到Git添加了此配置。
JesperRønn-Jensen2014年

所有这些神秘选择的根源在哪里?
xaxxon 2015年

有人知道图形的默认标志吗?我在链接的
@xaxxon

@myol,您应该使用git config --helpgit help config获取与您的安装相匹配的文档。
doak

46

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

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

太好了,这无疑是最好的答案。
杜安2012年

您还可以在格式化时使用颜色:“%C(yellow)%h%Creset%s”将像git log --oneline一样显示。
Avner

1
现在是一个简单的问题:如果您发现这很有用,并且可以准确回答问题,为什么不将其标记为正确呢?
igorsantos12年

1
如果您不想记住晦涩难懂的别名,而宁愿一直使用“ git log”,则更好。
Shyam Habarakada 2014年

1
这是对我最好的答案。该log.abbrevCommit设置影响其他更详细的格式,我不喜欢。此外,还可%C(auto)%h %s用于获取具有自动着色功能的普通单行格式。我使用git config --global format.pretty "%C(auto)%h %d %s"是因为我想将
单行

33

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

您可以使用git别名使用所需参数定义新命令:

git config alias.lg "log --oneline"

然后,您可以运行git lg

某些命令还具有配置设置以更改其行为。


12
我想避免创建自己的语法,所以我更喜欢一个我不使用的解决方案,git lg但是git log
JesperRønn-Jensen10年

为什么?会有什么不同?
hasen

46
非常重要的区别是,我不想在系统上引入“ Jespers git语法”。我希望我(以及其他使用我的计算机的人)使用通用命令。另外,这将使我在其他计算机上的工作更快:我不必担心会意外输入“ git lg”并出现“未找到”错误
JesperRønn-Jensen10年

19
如果其他人正在使用您的计算机并输入git log,则您预期的解决方案将意味着他们将获得他们未曾期望的结果。
阿比森

1
重新定义标准别名会破坏脚本。
justintime 2014年

10

VonC已经在他的答案中暗示了一个外壳包装器。这是我的包装程序的Bash实现。如果将其放入您的中.bashrc,则您的交互式外壳将支持覆盖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 -r gitAlias="git-$1"
    if 'which' "$gitAlias" >/dev/null 2>&1; then
        shift
        "$gitAlias" "$@"
    elif [[ "$1" =~ [A-Z] ]]; then
        # Translate "X" to "-x" to enable aliases with uppercase letters. 
        translatedAlias=$(echo "$1" | sed -e 's/[A-Z]/-\l\0/g')
        shift
        "$(which git)" "$translatedAlias" "$@"
    else
        "$(which git)" "$@"
    fi
} 

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

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

7

我有一个类似的问题(许多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。是的,这可能会破坏某些东西。
LovesTha 2015年

1
我喜欢这个,并做了另外两个调整。我将其设置为bash函数,并git通过添加第一行以获取实际的命令路径来命名它:thegit=`/usr/bin/which git`。我增加了一个选项,取消覆盖与像命令之前的X git x log ...if [ "$cmd" = "x" ]; then; $thegit $@
约书亚·戈德堡


0

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

如果git封装在包装脚本中,则...一切皆有可能。

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


所以你的意思是我应该可以通过在.bash_profile中添加别名来实现它?
杰斯珀·罗恩·詹森(JesperRønn-Jensen)2010年

@Jesper:这是个主意,因为包装器git.bat将能够检测到要执行的Git命令,并可以添加所需的任何选项。
VonC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.