Git 导出纯净代码包教程
简介
本教程详细介绍如何使用 Git 命令导出纯净的代码包,不包含 .git 目录和版本历史记录。适用于代码发布、项目交付、版本归档等场景。
方法一:创建临时 Tag 并导出
应用场景
- 需要基于特定版本(如发布版本)导出代码
- 希望保留版本标签信息
- 需要多次导出同一版本的代码
操作步骤
1. 创建临时 Tag
在本地仓库中创建临时标签:
# 创建多个版本标签示例
git tag dev-v1.0.3
git tag R5-v3.0
git tag R4-v3.0
git tag R5-v3.1
git tag R5-v3.0.7
2. 导出 Tag 为压缩包
使用 git archive 命令导出指定标签的代码:
# 基础导出命令
git archive --format=zip -o ../R5-v3.0-client.zip R5-v3.0
git archive --format=zip -o ../R5-v3.0-server.zip R5-v3.0
git archive --format=zip -o ../R4-v3.0-server.zip R4-v3.0
git archive --format=zip -o ../R4-v3.0-client.zip R4-v3.0
git archive --format=zip -o ../R5-v3.1-client.zip R5-v3.1
git archive --format=zip -o ../R5-v3.1-server.zip R5-v3.1
3. 带时间戳的导出(推荐)
为导出文件添加时间戳,便于版本管理:
# Windows PowerShell 环境
git archive --format=zip -o "../R5-v3.0-$(Get-Date -Format 'yyyyMMddHHmm')-client.zip" R5-v3.0
git archive --format=tar.gz -o "../R5-v3.1-$(Get-Date -Format 'yyyyMMddHHmm')-server.tar.gz" R5-v3.1
git archive --format=zip -o "../R4-v3.0-$(Get-Date -Format 'yyyyMMddHHmm')-client.zip" R4-v3.0
git archive --format=tar.gz -o "../R4-v3.0-$(Get-Date -Format 'yyyyMMddHHmm')-server.tar.gz" R4-v3.0
git archive --format=tar.gz -o "../R5-v3.0.7-$(Get-Date -Format 'yyyyMMddHHmm')-server.tar.gz" R5-v3.0.7
# Linux/Mac 环境(使用 date 命令)
git archive --format=zip -o "../R5-v3.0-$(date +%Y%m%d%H%M)-client.zip" R5-v3.0
4. 删除临时 Tag(可选)
如果不再需要临时标签,可以删除:
git tag -d R5-v3.0
git tag -d R4-v3.0
git tag -d R5-v3.1
git tag -d R5-v3.0.7
方法二:直接导出当前代码(无需 Tag)
应用场景
- 快速导出当前工作目录的代码
- 不需要版本标签信息
- 临时性代码导出需求
操作命令
# 导出当前最新提交
git archive --format=zip -o release-package.zip HEAD
# 导出特定分支的最新代码
git archive --format=zip -o release-package.zip main
参数说明
HEAD:表示当前最新的提交main:指定分支名称
方法三:手动打包纯净代码
应用场景
- 需要精细控制打包内容
- 需要排除特定文件或目录
- 复杂的文件筛选需求
操作步骤
1. 复制代码到临时目录
# 创建临时目录
mkdir temp-release
# 复制所有被 Git 跟踪的文件
git ls-files | xargs -I {} cp --parents {} temp-release/
2. 打包临时目录
# 进入临时目录并打包
cd temp-release
zip -r ../release-package.zip .
# 返回上级目录并清理
cd ..
rm -rf temp-release
3. 高级用法:排除特定文件
# 排除 node_modules 目录
git ls-files | grep -v node_modules | xargs -I {} cp --parents {} temp-release/
# 排除多个目录
git ls-files | grep -v -E '(node_modules|\.git|\.vscode)' | xargs -I {} cp --parents {} temp-release/
注意事项
1. 文件排除策略
- 自动排除:
git archive会自动忽略.gitignore中指定的文件 - 手动排除:使用
git ls-files时可以结合grep -v排除特定文件 - 权限保留:确保打包后的文件权限正确(尤其是可执行文件)
2. 子模块处理
如果项目包含子模块,需要额外处理:
# 导出包含子模块的代码
git archive --format=tar HEAD | tar -x -C temp-release
git submodule foreach --recursive 'git archive --prefix=$path/ HEAD | tar -x -C ../temp-release'
3. 格式选择
- ZIP:跨平台兼容性好,Windows 用户友好
- TAR.GZ:Linux/Unix 环境标准格式,压缩率更高
4. 路径管理
- 使用相对路径避免绝对路径问题
- 确保导出文件保存在合适的位置
最佳实践
1. 版本命名规范
# 推荐格式:项目名-版本-时间-类型.格式
git archive --format=zip -o "../myproject-v1.0-$(date +%Y%m%d%H%M)-client.zip" v1.0
2. 批量导出脚本
创建可重用的导出脚本:
#!/bin/bash
# export-release.sh
VERSION=$1
TYPE=$2
git archive --format=zip -o "../myproject-${VERSION}-$(date +%Y%m%d%H%M)-${TYPE}.zip" ${VERSION}
3. 验证导出结果
导出后验证文件完整性和权限:
# 检查压缩包内容
unzip -l release-package.zip | head -10
# 验证关键文件存在性
unzip -t release-package.zip
总结对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方法一(Tag导出) | 版本明确,可重复导出 | 需要创建临时Tag | 版本发布、正式交付 |
| 方法二(直接导出) | 简单快捷,无需Tag | 无法指定特定版本 | 临时导出、快速打包 |
| 方法三(手动打包) | 精细控制,灵活性强 | 操作复杂,容易出错 | 特殊需求、复杂筛选 |
推荐使用顺序:方法二 → 方法一 → 方法三