Git别名中sed命令失效:如何将仓库目录显示改为[foo]格式?
解决Git别名
all中目录名称格式化问题 问题说明
当前~/.gitconfig里的all别名能正常遍历子目录中的Git仓库执行命令,但输出的仓库路径(比如./foo/.git)不够直观,想要改成[foo]的简洁格式,不过别名内r()函数里的sed替换完全不起作用。
原别名配置:
all = "! \ r() { echo $@ | sed 's,/.git,,' ;}; \ f() { cd ${GIT_PREFIX:-.} ; find . -mindepth 2 -maxdepth 2 -type d -name '.git' -exec echo $(r {}) \\; -exec git -C {} $@ \\; ; }; f"
执行git all branch -a的原始输出示例:
./foo/.git remotes/origin/dev/foo * master remotes/origin/HEAD -> origin/master ./foo2/.git remotes/origin/dev/foo2 * master remotes/origin/HEAD -> origin/master ./foo3/.git remotes/origin/dev/foo3 * master remotes/origin/HEAD -> origin/master
问题根源
$(r {})是在定义f()函数的阶段就被提前展开执行,而非find命令遍历到每个.git目录时才调用r()处理路径,导致sed根本没拿到实际的路径参数,自然无法完成替换。
修复后的别名配置
调整函数调用的执行时机,确保每次遍历到目标目录时才处理路径,同时优化sed的替换逻辑:
all = "! \ r() { echo \"$1\" | sed -e 's|^\./||' -e 's|/.git$|]|' -e 's|^|[|' ;}; \ f() { cd \"${GIT_PREFIX:-.}\" ; find . -mindepth 2 -maxdepth 2 -type d -name '.git' -exec bash -c 'r \"$0\"' {} \\; -exec git -C {} \"$@\" \\; ; }; f"
关键修改点
- 给
r()函数的参数添加双引号,避免路径包含空格时出现错误 - 将
find的-exec echo $(r {})改为-exec bash -c 'r "$0"' {} \;,确保遍历到每个.git目录时才调用r()处理路径 - sed分三步完成格式转换:
s|^\./||:移除路径开头的./s|/.git$|]|:把结尾的/.git替换为]s|^|[|:在路径开头添加[,最终得到[foo]的格式
修复后执行效果
运行git all branch -a会输出:
[foo] remotes/origin/dev/foo * master remotes/origin/HEAD -> origin/master [foo2] remotes/origin/dev/foo2 * master remotes/origin/HEAD -> origin/master [foo3] remotes/origin/dev/foo3 * master remotes/origin/HEAD -> origin/master
内容的提问来源于stack exchange,提问作者nicod_
相关产品推荐
相关产品推荐

