CMake执行FetchContent_MakeAvailable时Git safe.directory配置问题
解决CMake FetchContent执行Git checkout时的"dubious ownership"错误
问题背景
在WSL Ubuntu 24环境下,CMake通过FetchContent_MakeAvailable拉取googletest时,底层执行git checkout步骤报错:
fatal: detected dubious ownership in repository at '/mnt/c/Users/User/Project/build.Debug/_deps/googletest-src'
原因是目标路径位于Windows NTFS磁盘,WSL下Git会因为文件系统权限映射问题,判定仓库目录存在可疑所有权,拒绝执行操作。
无效尝试分析
你之前使用的execute_process命令存在两个核心问题:
find_package(Git REQUIRED)是CMake命令,不能作为COMMAND参数传递给execute_process;- 硬编码的路径无法适配FetchContent自动生成的目录(比如构建目录名称变化时路径会直接失效)。
正确解决方法
方案1:在FetchContent声明时直接配置Git(推荐)
利用FetchContent_Declare的GIT_CONFIG选项,在git clone阶段就添加安全目录配置,无需硬编码路径:
FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG v1.17.0 OVERRIDE_FIND_PACKAGE GIT_CONFIG safe.directory=true ) FetchContent_MakeAvailable(googletest)
GIT_CONFIG会在执行git clone时自动添加--config safe.directory=true参数,让Git允许当前仓库目录的所有权,完美适配动态生成的路径。
方案2:全局配置Git允许所有WSL挂载的Windows目录
如果经常在WSL下访问Windows磁盘的代码仓库,可以一次性全局配置Git,避免重复操作:
git config --global --add safe.directory /mnt/c/*
该命令会将C盘下所有目录加入Git安全列表,同理可扩展到D盘等其他挂载盘。
方案3:动态获取路径并配置安全目录
如果需要针对特定仓库精确配置,可以先获取FetchContent的目标路径,再执行Git配置:
FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG v1.17.0 OVERRIDE_FIND_PACKAGE ) # 获取googletest的源目录路径 FetchContent_GetProperties(googletest) if(NOT googletest_POPULATED) # 在拉取代码前配置安全目录 execute_process( COMMAND git config --global --add safe.directory "${googletest_SOURCE_DIR}" RESULT_VARIABLE GIT_CONFIG_STATUS ) if(NOT GIT_CONFIG_STATUS EQUAL 0) message(WARNING "无法为googletest配置Git安全目录") endif() FetchContent_Populate(googletest) add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR}) endif()
通过FetchContent_GetProperties动态获取路径,避免硬编码的局限性,确保配置的目录准确。
内容的提问来源于stack exchange,提问作者JamesThomasMoon
相关产品推荐
相关产品推荐

