You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"

关键修改点

  1. 给r()函数的参数添加双引号,避免路径包含空格时出现错误
  2. 将find的-exec echo $(r {})改为-exec bash -c 'r "$0"' {} \;,确保遍历到每个.git目录时才调用r()处理路径
  3. 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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:57:11