git log指定文件路径时如何在图形化日志输出中显示分支名
问题原因
当你给git log传入文件路径参数时,输出的是仅修改过该文件的提交子集。如果某个分支的最新提交没有修改对应文件,该分支的引用指针就不会出现在这个过滤后的提交序列中,原生的--decorate参数找不到可以挂载分支标注的节点,因此不会显示分支名。
解决方案
方案1:使用git name-rev快速补充分支标注
Git自带的git name-rev工具可以自动识别输入流中的提交哈希,并补充对应的分支名,一行命令即可实现需求:
git log --graph --all --oneline --decorate=full develop -- ./path/to/a/file | git name-rev --stdin --name-only --refs=refs/heads/*
输出会自动在每个提交哈希后标注对应的分支名,适合快速查询场景。
方案2:自定义脚本输出完全匹配预期的格式
如果需要完全贴合示例中括号包裹分支名的展示效果,可以用下面的脚本化命令,自动给每个提交查询所属分支并插入标注:
git log --graph --all --pretty='%h %s' develop -- ./path/to/a/file | while read line; do # 识别行中的提交哈希 if [[ $line =~ \*[[:space:]]+([0-9a-f]{7,}) ]]; then commit=${BASH_REMATCH[1]} # 查询提交所属分支,过滤掉 detached HEAD 记录 branches=$(git branch --contains $commit | grep -v 'HEAD detached' | sed 's/^[ *]*//' | tr '\n' ', ' | sed 's/, $//') if [ -n "$branches" ]; then # 把分支名用括号包裹插入到哈希后 echo "${line/$commit/$commit ($branches)}" else echo "$line" fi else echo "$line" fi done
如果需要长期使用,可以把这段逻辑封装为自定义Git别名,后续调用更方便。
内容的提问来源于stack exchange,提问作者SATO Yusuke
相关产品推荐
相关产品推荐

