使用与其他命令相同的 git Blame 提交缩写长度

问题描述 投票:0回答:2

git blame
命令显示缩写为比其他命令长一个字符的长度的提交哈希。例如:

$ git log --oneline       
9fb6f706 (HEAD -> master) second commit
0af747a8 first commit
$ git blame foo   
9fb6f7064 (gilles 2020-11-15 12:28:09 +0100 1) revised
^0af747a8 (gilles 2020-11-15 12:27:41 +0100 2) world

我经常从

blame
输出中复制粘贴缩写哈希,并在日志或交互式变基中的提交集中搜索它。但因为
git blame
输出中缩写多了一个字符,所以我必须记住删除最后一个字符,否则搜索找不到任何东西。

对于脚本编写,我会使用未缩写的哈希值和瓷器格式。但对于交互式使用,我想使用缩写的哈希值。

设置

core.abbrev
选项没有帮助:
git blame
会加一。设置
core.abbrev
并使用一个少 1 的值调用
blame --abbrev
,但这不是一个好的解决方案,因为我失去了 git 启发式的优势来确定短提交 ID 的良好长度,并且我必须显式传递此选项或使用不同的命令名称作为别名。

我怎样才能让一个简单的

git blame
使用与其他git命令相同的长度来缩写提交ID?

git git-blame
2个回答
0
投票

感谢您深入研究源代码。恐怕你唯一的解决方案 - 相反的解决方法是定义一个自定义别名。

git config --global alias.blame2 '!git -c core.abbrev=6 blame'

0
投票

我最终为此编写了一个自定义 Git 命令。将下面的代码保存在您的

git-blame-1
上某个名为
$PATH
的可执行文件中。现在您可以运行
git blame-1
而不是
git blame
,并且提交的 ID 缩写将与其他命令(例如
git rebase
)具有相同的长度。

#!/usr/bin/env bash

set -o pipefail

# The blame command adds one hex digit to abbreviated commit IDs to ensure that
# boundary commits are unambiguous (boundary commits have leading ^ and then
# just enough hex digits to be unambiguous, while other commits have an
# extra hex digit so that they're the same length as boundary commits).
# This alias removes the extra digit, so the abbreviated IDs are the same
# length as other commands such as log and rebase -i. With low probability,
# this can make the abbreviation of boundary commit IDs ambiguous.

# Implementation note: we use a sed filter to detect lines starting with an
# optional escape sequence for coloring, then an optional ^, then hex digits
# and a space. The sed filter here removes the last hex digit.

# Note that $sed_filter does not contain any single quote, so it can be
# included in a shell snippet as "...'$sed_filter'...".
sed_filter='s/^\(\(0-9;]*m\)*\^*[0-9a-f]*\)[0-9a-f] /\1 /'

if [ -t 1 ]; then
  GIT_PAGER="sed '$sed_filter' | ${GIT_PAGER:-${PAGER:-less}}" git blame "$@"
else
  git blame "$@" | sed "$sed_filter"
fi

该脚本在终端上运行时负责保留分页。这必须是一个单独的脚本,而不是别名,因为 shell 别名从根目录运行,因此它们无法在子目录中正常工作。

我还定义了一个别名来节省打字。在我的

.gitconfig
中:

b1 = blame-1     # blame with standard abbreviated commit IDs
© www.soinside.com 2019 - 2024. All rights reserved.