如何发布git下的私有化项目

如何发布git下的私有化项目

流程

1. 私有项目添加远程仓库

# 添加公开仓库作为远程仓库
git remote add public-repo [开放部分远程地址]

# 验证远程仓库添加成功
git remote -v

2. 为公开的远程仓库创建特殊的分支

# 从当前分支创建发布分支
git checkout -b release-branch

# 或者从main/master分支创建
git checkout main
git checkout -b release-branch

3. 对已有的开发内容进行Squash操作,然后merge到发布分支

# 首先找到能够公开的最后一个版本(commit hash)
git log --oneline  # 查看提交历史,找到合适的公开起点

# 基于公开起点创建发布分支(替代之前的revert方式)
git checkout -b release-branch [公开起点的commit hash]

# 或者如果已经创建了release-branch,重置到公开起点
git checkout release-branch
git reset --hard [公开起点的commit hash]

# 将开发分支的内容squash合并到发布分支
git merge --squash develop-branch

# 提交汇总的更改
git commit -m "Release: 版本号 - 功能概述"

# 如果确实需要使用revert(不推荐,因为会产生反向提交)
# git revert [需要隐藏的私有提交]..HEAD --no-commit
# git commit -m "隐藏私有开发内容"

4. push

# 推送到公开仓库的发布分支
git push public-repo release-branch:main

# 或者推送到特定分支
git push public-repo release-branch:release-branch

# 如果需要打标签
git tag -a v1.0.0 -m "版本1.0.0发布"
git push public-repo --tags

完整示例脚本(修正版)

#!/bin/bash

# 设置变量
PUBLIC_REPO_URL="https://github.com/username/public-repo.git"
RELEASE_BRANCH="release-(date +%Y%m%d)"
PUBLIC_START_COMMIT="a1b2c3d"  # 替换为实际能够公开的commit hash

# 1. 添加远程仓库
git remote add public-repoPUBLIC_REPO_URL

# 2. 基于公开起点创建发布分支
git checkout -b RELEASE_BRANCHPUBLIC_START_COMMIT

# 3. Squash操作(从develop分支合并,但只包含公开内容)
git merge --squash develop

# 检查合并内容,移除敏感信息
git status
git diff --cached

# 提交公开版本
git commit -m "Release: v1.0.0 - 公开功能更新"

# 4. 推送到公开仓库
git push public-repo $RELEASE_BRANCH:main

echo "发布完成!"

更安全的替代方案

# 方案一:使用cherry-pick选择特定提交
git checkout -b release-branch [公开起点commit]
git cherry-pick [选择需要公开的提交范围] --no-commit
git commit -m "Release: 精选功能更新"

# 方案二:使用patch方式提取更改
git format-patch [公开起点commit]..develop --stdout > changes.patch
git checkout release-branch
git apply changes.patch
git add .
git commit -m "Release: 应用公开更改"

注意事项

  • 重要:发布前务必检查所有文件是否包含敏感信息(API密钥、密码、内部链接等)
  • 使用git log --oneline找到合适的公开起点commit
  • 考虑使用.gitignore.gitattributes过滤敏感文件
  • 推荐在发布前创建代码审查流程
  • 可以使用git secretgit-crypt工具管理敏感文件

这样修正后,流程更加清晰和安全,避免了revert可能带来的混淆。