有了像git log --abbrev-commit --pretty=format:'%h %<(72,trunc)%s %d'这样的东西,您就可以得到一个与图形相当一致的git提交消息。如果您删除--graph选项,它将完全对齐。下面是命令的大致内容
* 40f1481 Commit title message (HEAD, dev)
|\
| * 9b5122d Commit title message (debug)
| * fe7ddfe Commit title message
| * 8e4d414 Commit title message
| * 53affdd Commit title message
| * a45fbaf Commit title message
|/
* 36b23c3 Commit title message
* 5b7bfe1 Commit title message (master)问题是,对于图形符号,对齐是混乱的,正如您在前两次提交中看到的那样。理想情况是这样的
* 40f1481 Commit title message (HEAD, dev)
|\
| * 9b5122d Commit title message (debug)
| * fe7ddfe Commit title message
| * 8e4d414 Commit title message
| * 53affdd Commit title message
| * a45fbaf Commit title message
|/
* 36b23c3 Commit title message
* 5b7bfe1 Commit title message (master)我的问题是,在使用绘图选项时,是否有获得正确对齐的选项?还是要获得图形的宽度,这样就可以相应地填充日志了?
我知道一种快速的攻击就是按选项卡(%x09)填充第一个选项,而且它应该适用于大多数项目,但我想知道它们是否是一个美观的、优越的、万无一失的选项,可以用最小的填充来完成,但在5还不够的情况下也能工作。下面是选项卡解决方案失败的示例

使用列登录,不使用彩色图形。

完全成功!稍后会尝试更新。

发布于 2017-09-16 07:33:32
我所见过的最接近于正确对齐的git log是garybernhardt/dotfiles/.githelpers。
Gary使用:
column我在回购装置的克隆中进行了测试
vonc@VONCAVN7:~/gits/src/git$
git -c color.ui=auto log --graph --pretty=tformat:"%C(yellow)%h%Creset}%Cgreen(%ar)%Creset}%C(bold blue)<%an>%Creset}%C(bold red)%d%Creset %s" -100| column -s '}' -t多行:
git -c color.ui=auto log --graph \
--pretty=tformat:"%C(yellow)%h%Creset}%Cgreen(%ar)%Creset}%C(bold blue)<%an>%Creset}%C(bold red)%d%Creset %s" \
-100| column -s '}' -t但是:它只适用于color.ui设置为false或auto,而不是始终设置:颜色会破坏colum对齐。
没有颜色的:
* 238e487ea (3 weeks ago) <Junio C Hamano> (HEAD -> master, tag: v2.14.1-b5, origin/master, origin/HEAD) The fifth batch post 2.14
* 6e6ba65a7 (3 weeks ago) <Junio C Hamano> Merge branch 'mg/killed-merge'
|\
| * 9d89b3552 (3 weeks ago) <Michael J Gruber> merge: save merge state earlier
| * 8e6a6bb36 (3 weeks ago) <Michael J Gruber> merge: split write_merge_state in two
| * 62dc42b93 (3 weeks ago) <Michael J Gruber> merge: clarify call chain
| * e2de82f27 (4 weeks ago) <Michael J Gruber> Documentation/git-merge: explain --continue
* | eabdcd4ab (3 weeks ago) <Junio C Hamano> Merge branch 'jt/packmigrate'
|\ \
| * | 7709f468f (4 weeks ago) <Jonathan Tan> pack: move for_each_packed_object()
| * | f9a8672a8 (4 weeks ago) <Jonathan Tan> pack: move has_pack_index()
...
...
...
| * | | | | | | | fdbdb64f4 (5 weeks ago) <Jeff King> interpret-trailers: add an option to show only existing trailers
| * | | | | | | | 56c493ed1 (5 weeks ago) <Jeff King> interpret-trailers: add an option to show only the trailers
| * | | | | | | | 8abc89800 (5 weeks ago) <Jeff King> trailer: put process_trailers() options into a struct
* | | | | | | | | bfd91b413 (3 weeks ago) <Junio C Hamano> Merge branch 'pb/trailers-from-command-line'
|\ \ \ \ \ \ \ \ \
| * | | | | | | | | c88bf5436 (7 weeks ago) <Paolo Bonzini> interpret-trailers: fix documentation typo
| * | | | | | | | | 0ea5292e6 (7 weeks ago) <Paolo Bonzini> interpret-trailers: add options for actions前100次提交完全对齐。
用颜色..。

您需要对git日志输出进行额外的预处理,然后才能将其输送到列。
见"印刷精美的列中的颜色转义码“。
发布于 2019-02-28 21:34:39
现代版本的Git (我在cygwin环境上有git 2.17.0 )可以很好地处理彩色图形和缩进,而不需要任何额外的工具或脚本。
我的.gitconfig别名部分:
[alias]
l = log --graph --abbrev-commit --decorate=no --date=format:'%Y-%m-%d %H:%I:%S' --format=format:'%C(03)%>|(26)%h%C(reset) %C(04)%ad%C(reset) %C(green)%<(16,trunc)%an%C(reset) %C(bold 1)%d%C(reset) %C(bold 0)%>|(1)%s%C(reset)' --all我已经在django官方存储库而且效果很好上测试了它

发布于 2018-12-22 04:59:47
下面的bash函数是我的解决方案,用于将git日志列与包装文本对齐,并支持颜色和图形线。
特性:
已知问题:
对于非图形选项,需要:GIT1.9.5或更高版本。当图形出现时,需要比1.9.5略新的版本来正确对齐包装文本
未来改进:
巴什码
function gitlog
{
# Check for the existence of certain git log arguments
local using_graph=false
local arg_i
for arg_i in "$@"
do
if [ "$arg_i" = "--graph" ]; then
using_graph=true
fi
if [ "$arg_i" = "--oneline" ]; then
printf -- "--oneline not allowed for this shell function.\n use regular git log for oneline.\n"
return 1
fi
done
# Set the OS dependant options
# my_system_type can be set by sourcing my .bashrc
local sed_regex_sym="r"
if [ ! -z "$my_system_type" ]; then
if [ "$my_system_type" = Mac ]; then
sed_regex_sym="E"
fi
fi
# Set the pre-determined column sizes here
local N_AUTH_DATE_CHARS=11
local N_AUTH_NAME_CHARS=15
# Determine where to place columns for the various content
local scrn_sz_arr=( $(stty size) ) #stty not tput in case of missing TERMINFO
local N_SCRN_COLS=${scrn_sz_arr[1]}
local N_HASH_CHARS=$(git log --pretty=format:%h -1 | tr -d '\n' | wc -c | tr -d '[:space:]')
if [ "$using_graph" = true ]; then
local N_GRPH_MAX_CHARS=$(expr $N_SCRN_COLS / 5) #Use no more then 20% of screen
local N_GRPH_ACT_CHARS=$(git log --graph --pretty=format:"%<(1,trunc)%ad" | tr -d '..' | \
awk '{print length}' | sort -nr | head -1 | tr -d '[:space:]')
if [ "$N_GRPH_ACT_CHARS" -lt "$N_GRPH_MAX_CHARS" ]; then
local N_GRPH_RSRV_CHARS=$N_GRPH_ACT_CHARS
else
local N_GRPH_RSRV_CHARS=$N_GRPH_MAX_CHARS
fi
#Extend space of N_HASH_CHARS to keep alignment when --graph option used.
N_HASH_CHARS=$(expr $N_HASH_CHARS + $N_GRPH_RSRV_CHARS)
fi
local N_MSG_INDENT_CHARS=$(expr $N_HASH_CHARS + 1 + $N_AUTH_DATE_CHARS + $N_AUTH_NAME_CHARS + 1)
local N_STAT_INDENT_CHARS=$(expr $N_MSG_INDENT_CHARS + 2)
# Check that there is sufficient room to place all the content
local N_MIN_COLS=$(expr $N_STAT_INDENT_CHARS + 12)
if [ "$N_MIN_COLS" -gt "$N_SCRN_COLS" ]; then
printf -- "Terminal window too narrow.\nNeed at least $N_MIN_COLS cols for this mode.\n"
return 1
fi
# Git log logic below is as follows
# - use date=short to minimize space used by that column. Linked with
# N_AUTH_DATE_CHARS
# - use --pretty-format to specify columns as
# hash--author date--author name--commit message.
# - first 4 sed statement removes color (if present) from graph lines
# containing wrapped pretty-print text. Done for aligment of wrapped
# text. Was one sed using back references, but that was not compatible
# with BSD (OSX) sed with -E.
# - fifth sed blanks out graph lines from newlines that were introduced
# between commits by tformat.
# - sixth sed aligns wrapped text from pretty-print into message column.
# - last three sed statements insert a tab as a delimiter (recall tabs
# removed by expand) between any other text and the --name-status text.
# This is in anticipation of the awk statement at the next pipe
# - awk used to right pad the first column up to N_STAT_INDENT_CHARS and
# place any --name-status fields present to its right in order to
# align it with the message text.
# - use tr to delete the inserted tabs that were used for column alignment
# - sed to remove any trailing white space.
# - awk removes extraneous blank lines
# - finally pipe to less -R to force the color option
git log \
--date=short \
--pretty=tformat:"%C(auto)%w($N_SCRN_COLS,0,$N_MSG_INDENT_CHARS)%>|($N_HASH_CHARS)%h%x09%<($N_AUTH_DATE_CHARS,trunc)%ad%<($N_AUTH_NAME_CHARS,trunc)%an%x09%C(bold blue)%s%C(auto)%+d" \
$* | \
expand -t 1 | \
sed -$sed_regex_sym $'/.*[*]/!{/.*[|]{1}/s/\x1b\\[([0-9](;[0-9])*)*[mGK]([_])\x1b\\[([0-9](;[0-9])*)*[mGK]/_/g;}' | \
sed -$sed_regex_sym $'/.*[*]/!{/.*[|]{1}/s/\x1b\\[([0-9](;[0-9])*)*[mGK]([|])\x1b\\[([0-9](;[0-9])*)*[mGK]/|/g;}' | \
sed -$sed_regex_sym $'/.*[*]/!{/.*[|]{1}/s/\x1b\\[([0-9](;[0-9])*)*[mGK]([\\])\x1b\\[([0-9](;[0-9])*)*[mGK]/\\\/g;}' | \
sed -$sed_regex_sym $'/.*[*]/!{/.*[|]{1}/s/\x1b\\[([0-9](;[0-9])*)*[mGK]([\/])\x1b\\[([0-9](;[0-9])*)*[mGK]/\//g;}' | \
sed -$sed_regex_sym "/^[|[:space:]]+[^[:alnum:]\\\/]+$/s/[|]//g" | \
sed -$sed_regex_sym "/^[|]/s/^(.{$N_MSG_INDENT_CHARS})[[:space:]]*/\1/" | \
sed -$sed_regex_sym "s/^([[:space:]_|\\\/]{0,$N_HASH_CHARS})([A-Z][[:space:]])/\1$(printf -- '\t')\2/" | \
sed -$sed_regex_sym "s/^([[:space:]_|\\\/]{0,$N_HASH_CHARS})([R][0-9][0-9][0-9][[:space:]])/\1$(printf -- '\t')\2/" | \
sed -$sed_regex_sym "s/^([[:space:]_|\\\/]{0,$N_HASH_CHARS})([C][0-9][0-9][[:space:]])/\1$(printf -- '\t')\2/" | \
awk 'BEGIN{ FS="\t" }{ printf "%-'$N_STAT_INDENT_CHARS's%s\n", $1, $2 }' | \
tr -d '\t' | \
sed -$sed_regex_sym 's/[[:space:]]*$//' | \
awk NF | \
less -R --chop-long-lines
}示例输出


https://stackoverflow.com/questions/46229359
复制相似问题