跳到主要内容

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无法指定特定版本临时导出、快速打包
方法三(手动打包)精细控制,灵活性强操作复杂,容易出错特殊需求、复杂筛选

推荐使用顺序:方法二 → 方法一 → 方法三


扩展阅读