如何在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
相关产品推荐
相关产品推荐

