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 config --global alias.blame2 '!git -c core.abbrev=6 blame'
我最终为此编写了一个自定义 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