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

如何在Makefile中切换目录执行git log并保存日志文件?

Makefile中多仓库git log命令的问题解决方法

问题原因

Makefile中每一行缩进的命令都会启动一个独立的Shell进程执行,所以cd $(PATH1)执行完毕后,该Shell进程就会退出,后续的git log命令还是在Makefile所在的原始目录中执行,自然不会切换到目标仓库路径。同时未加@的cd命令会被默认输出到控制台。

解决方法

方法1:将cd与git命令放在同一Shell进程执行

通过&&或分号;将cd和git命令合并到同一行,或者用括号包裹命令组,让它们在同一个Shell进程中运行:

方式A:使用&&(仅当前面命令成功时执行后续命令)

git_logs:
    @cd $(PATH1) && git log -1 --stat > ../path1_logs.txt
    @cd $(PATH2) && git log -1 --stat > ../path2_logs.txt
    @echo "Git logs stored"

注:如果希望日志文件保存在目标仓库目录中,直接写path1_logs.txt即可;若要保存在Makefile所在目录,需用../path1_logs.txt或绝对路径。

方式B:使用括号包裹命令组(强制在同一Shell执行)

git_logs:
    @(cd $(PATH1); git log -1 --stat > path1_logs.txt)
    @(cd $(PATH2); git log -1 --stat > path2_logs.txt)
    @echo "Git logs stored"

括号内的所有命令会在同一个Shell进程中执行,cd的目录切换会持续到括号内命令执行完毕。

方法2:直接指定Git仓库路径(无需cd)

利用Git的--git-dir和--work-tree参数,直接指定目标仓库的.git目录和工作树路径,无需切换目录:

git_logs:
    @git --git-dir=$(PATH1)/.git --work-tree=$(PATH1) log -1 --stat > path1_logs.txt
    @git --git-dir=$(PATH2)/.git --work-tree=$(PATH2) log -1 --stat > path2_logs.txt
    @echo "Git logs stored"

这种方式更简洁,避免了目录切换的Shell进程问题,尤其适合路径复杂的场景。

内容的提问来源于stack exchange,提问作者Rutuja14

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:24:57