如何让Jenkins将代码检出到独立目录且不含.git文件夹?
解决方案
核心问题
Jenkins的GitSCM插件(即你使用的checkout步骤)会自行管理Git仓库的存储路径,不会读取GIT_WORK_TREE环境变量,所以你之前的配置无法生效。要实现代码直接检出到测试站点且不带.git文件夹,建议直接使用原生Git命令替代插件的checkout步骤,这样能精确控制Git目录和工作树的位置。
方案一:分离Git目录与工作树(推荐)
这个方案会把Git仓库的.git目录存在Jenkins工作区,代码直接检出到C:\Inetpub\wwwroot,目标目录不会留下任何Git相关文件:
修改你的流水线代码如下:
pipeline { agent any stages { stage('checkout to test site') { steps { bat ''' :: 创建存放Git仓库的目录(Jenkins工作区内) if not exist "%WORKSPACE%\\git_repo" mkdir "%WORKSPACE%\\git_repo" cd "%WORKSPACE%\\git_repo" :: 初始化Git仓库(仅第一次执行需要,后续跳过也可) if not exist ".git" git init :: 设置远程仓库(仅第一次执行需要) git remote get-url origin >nul 2>&1 || git remote add origin ssh://git@myBitBucketServer/web/wwwroot.git :: 拉取最新代码 git fetch origin :: 将test_branch分支的代码检出到测试站点目录 git checkout test_branch --work-tree="C:\\Inetpub\\wwwroot" ''' } } stage('verify') { steps { bat 'dir "C:\\Inetpub\\wwwroot"' println "All done" } } } }
方案二:克隆时指定分离的Git目录
如果是第一次部署,也可以用clone --separate-git-dir直接完成,但会在C:\Inetpub\wwwroot生成一个.git文本文件(指向Jenkins工作区的Git目录),如果介意这个文件,优先选方案一:
pipeline { agent any stages { stage('clone to test site') { steps { bat ''' :: 克隆仓库,Git目录存在Jenkins工作区,工作树在测试站点 git clone --separate-git-dir="%WORKSPACE%\\test_repo.git" ssh://git@myBitBucketServer/web/wwwroot.git "C:\\Inetpub\\wwwroot" cd "C:\\Inetpub\\wwwroot" git checkout test_branch ''' } } stage('verify') { steps { bat 'dir "C:\\Inetpub\\wwwroot"' println "All done" } } } }
补充说明
- 确保Jenkins代理用户拥有
C:\Inetpub\wwwroot的读写权限,否则检出会失败。 - 后续提交后,方案一的
git fetch + checkout操作会非常快,和你之前的增量检出速度一致。 - 如果需要清理测试站点的旧文件,可以在
checkout前添加bat 'rmdir /s /q "C:\\Inetpub\\wwwroot" && mkdir "C:\\Inetpub\\wwwroot"'(注意:会删除目标目录所有内容,谨慎使用)。
内容的提问来源于stack exchange,提问作者Ryan Stille
相关产品推荐
相关产品推荐

