C语言中popen()无法切换目录获取Git SHA的问题求助
解决popen()执行切换目录+Git命令返回错误SHA的问题
原因分析
popen()启动的子进程会继承父进程(脚本进程)的工作目录,虽然命令里写了cd 目标路径 && git ...,但Windows环境下默认shell的解析逻辑可能导致cd的目录切换无法覆盖后续git命令;或是.bat文件未正确设置目录切换的生效范围。
具体解决方案
方案1:用cmd.exe完整封装命令
直接调用cmd.exe执行带引号的完整命令,确保cd与git命令在同一shell会话内生效:
FILE* pipe = popen("cmd /c \"cd C:/path_to_embedded_project_with_git/ && git rev-parse --short HEAD\"", "r");
方案2:修正.bat文件并通过cmd执行
修改.bat文件,添加/d参数确保跨驱动器目录切换生效,再用popen调用cmd执行该bat:
bat文件内容(如get_git_sha.bat):
@echo off cd /d C:/path_to_embedded_project_with_git/ git rev-parse --short HEAD
popen调用代码:
FILE* pipe = popen("cmd /c get_git_sha.bat", "r");
方案3:先切换父进程工作目录
用_chdir()(Windows环境)临时切换到目标目录,执行git命令后再切回原路径:
// 切换到目标项目目录 _chdir("C:/path_to_embedded_project_with_git/"); // 执行Git命令 FILE* pipe = popen("git rev-parse --short HEAD", "r"); // 执行完成后切回脚本原目录 _chdir("原脚本所在路径");
方案4:直接用Git的-C参数指定工作目录
Git本身支持-C参数指定执行目录,无需cd命令,这是最可靠的方法:
FILE* pipe = popen("git -C C:/path_to_embedded_project_with_git/ rev-parse --short HEAD", "r");
内容的提问来源于stack exchange,提问作者RebRaggio
相关产品推荐
相关产品推荐

