|
|
# nnet 多仓库发布指南
|
|
|
|
|
|
## 一、Git多远程仓库配置
|
|
|
|
|
|
### 1.1 添加多个远程仓库
|
|
|
|
|
|
```bash
|
|
|
# 查看当前远程仓库
|
|
|
git remote -v
|
|
|
|
|
|
# 添加GitHub远程仓库(通常命名为origin)
|
|
|
git remote add origin https://github.com/noahlann/nnet.git
|
|
|
|
|
|
# 添加Gitee远程仓库
|
|
|
git remote add gitee https://gitee.com/noahlann/nnet.git
|
|
|
|
|
|
# 添加私有库远程仓库
|
|
|
git remote add private https://your-private-git.com/noahlann/nnet.git
|
|
|
|
|
|
# 或者使用SSH方式
|
|
|
git remote add origin git@github.com:noahlann/nnet.git
|
|
|
git remote add gitee git@gitee.com:noahlann/nnet.git
|
|
|
git remote add private git@your-private-git.com:noahlann/nnet.git
|
|
|
```
|
|
|
|
|
|
### 1.2 查看所有远程仓库
|
|
|
|
|
|
```bash
|
|
|
git remote -v
|
|
|
```
|
|
|
|
|
|
输出示例:
|
|
|
```
|
|
|
origin https://github.com/noahlann/nnet.git (fetch)
|
|
|
origin https://github.com/noahlann/nnet.git (push)
|
|
|
gitee https://gitee.com/noahlann/nnet.git (fetch)
|
|
|
gitee https://gitee.com/noahlann/nnet.git (push)
|
|
|
private https://your-private-git.com/noahlann/nnet.git (fetch)
|
|
|
private https://your-private-git.com/noahlann/nnet.git (push)
|
|
|
```
|
|
|
|
|
|
### 1.3 修改远程仓库URL
|
|
|
|
|
|
如果需要修改已存在的远程仓库URL:
|
|
|
|
|
|
```bash
|
|
|
# 修改origin的URL
|
|
|
git remote set-url origin https://github.com/noahlann/nnet.git
|
|
|
|
|
|
# 修改gitee的URL
|
|
|
git remote set-url gitee https://gitee.com/noahlann/nnet.git
|
|
|
```
|
|
|
|
|
|
## 二、同时推送到多个仓库
|
|
|
|
|
|
### 2.1 方法1:使用多个push命令(推荐)
|
|
|
|
|
|
```bash
|
|
|
# 推送到GitHub
|
|
|
git push origin main
|
|
|
|
|
|
# 推送到Gitee
|
|
|
git push gitee main
|
|
|
|
|
|
# 推送到私有库
|
|
|
git push private main
|
|
|
```
|
|
|
|
|
|
### 2.2 方法2:配置push URL(一次push到多个仓库)
|
|
|
|
|
|
```bash
|
|
|
# 为origin添加多个push URL
|
|
|
git remote set-url --add --push origin https://github.com/noahlann/nnet.git
|
|
|
git remote set-url --add --push origin https://gitee.com/noahlann/nnet.git
|
|
|
git remote set-url --add --push origin https://your-private-git.com/noahlann/nnet.git
|
|
|
|
|
|
# 现在只需要一个push命令
|
|
|
git push origin main
|
|
|
```
|
|
|
|
|
|
**注意**:这种方法会同时推送到所有配置的URL,但fetch时只会从第一个URL获取。
|
|
|
|
|
|
### 2.3 方法3:使用Git别名(推荐用于日常开发)
|
|
|
|
|
|
创建便捷的别名:
|
|
|
|
|
|
```bash
|
|
|
# 创建推送所有仓库的别名
|
|
|
git config alias.pushall '!git push origin main && git push gitee main && git push private main'
|
|
|
|
|
|
# 使用别名
|
|
|
git pushall
|
|
|
```
|
|
|
|
|
|
或者添加到 `.git/config` 文件:
|
|
|
|
|
|
```ini
|
|
|
[alias]
|
|
|
pushall = !git push origin main && git push gitee main && git push private main
|
|
|
```
|
|
|
|
|
|
### 2.4 方法4:使用脚本(最灵活)
|
|
|
|
|
|
创建 `scripts/push-all.sh`:
|
|
|
|
|
|
```bash
|
|
|
#!/bin/bash
|
|
|
|
|
|
# 推送所有远程仓库
|
|
|
echo "Pushing to GitHub..."
|
|
|
git push origin main || echo "Failed to push to GitHub"
|
|
|
|
|
|
echo "Pushing to Gitee..."
|
|
|
git push gitee main || echo "Failed to push to Gitee"
|
|
|
|
|
|
echo "Pushing to Private..."
|
|
|
git push private main || echo "Failed to push to Private"
|
|
|
|
|
|
echo "Done!"
|
|
|
```
|
|
|
|
|
|
使用:
|
|
|
|
|
|
```bash
|
|
|
chmod +x scripts/push-all.sh
|
|
|
./scripts/push-all.sh
|
|
|
```
|
|
|
|
|
|
## 三、Go模块路径配置
|
|
|
|
|
|
### 3.1 问题:Go模块路径的选择
|
|
|
|
|
|
Go的 `go.mod` 中只能有一个 `module` 路径,但不同仓库可能有不同的URL。
|
|
|
|
|
|
### 3.2 解决方案
|
|
|
|
|
|
#### 方案1:使用GitHub作为主路径(推荐,当前采用)
|
|
|
|
|
|
```go
|
|
|
// go.mod
|
|
|
module github.com/noahlann/nnet
|
|
|
|
|
|
go 1.25
|
|
|
```
|
|
|
|
|
|
**优点**:
|
|
|
- GitHub是Go生态中最常用的
|
|
|
- 大多数Go工具默认支持GitHub
|
|
|
- 社区熟悉
|
|
|
- 无需额外配置
|
|
|
|
|
|
**缺点**:
|
|
|
- 如果GitHub不可访问,会有问题
|
|
|
|
|
|
**当前配置**:
|
|
|
- 模块路径:`github.com/noahlann/nnet`
|
|
|
- 无需域名配置
|
|
|
|
|
|
#### 方案2:使用Gitee作为主路径(国内用户)
|
|
|
|
|
|
```go
|
|
|
// go.mod
|
|
|
module gitee.com/yourusername/nnet
|
|
|
|
|
|
go 1.25
|
|
|
```
|
|
|
|
|
|
**优点**:
|
|
|
- 国内访问速度快
|
|
|
- 适合国内开发者
|
|
|
|
|
|
**缺点**:
|
|
|
- 国际开发者可能不熟悉
|
|
|
|
|
|
#### 方案3:使用自定义域名
|
|
|
|
|
|
```go
|
|
|
// go.mod
|
|
|
module go.noahlan.cn/nnet
|
|
|
|
|
|
go 1.25
|
|
|
```
|
|
|
|
|
|
**优点**:
|
|
|
- 不依赖特定平台
|
|
|
- 可以随时切换仓库
|
|
|
- 更专业
|
|
|
- 更好的控制权
|
|
|
|
|
|
**缺点**:
|
|
|
- 需要配置域名和重定向
|
|
|
|
|
|
### 3.3 配置Go代理和私有仓库
|
|
|
|
|
|
#### 配置GOPROXY(支持多个源)
|
|
|
|
|
|
```bash
|
|
|
# 设置Go代理(按优先级)
|
|
|
go env -w GOPROXY=https://goproxy.cn,direct
|
|
|
|
|
|
# 或者使用多个代理
|
|
|
go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct
|
|
|
```
|
|
|
|
|
|
#### 配置GOPRIVATE(私有仓库)
|
|
|
|
|
|
```bash
|
|
|
# 设置私有仓库(不走代理)
|
|
|
go env -w GOPRIVATE=your-private-git.com/*,gitee.com/yourusername/*
|
|
|
```
|
|
|
|
|
|
#### 配置GOSUMDB(校验和数据库)
|
|
|
|
|
|
```bash
|
|
|
# 对于私有仓库,禁用校验和检查
|
|
|
go env -w GOSUMDB=off
|
|
|
|
|
|
# 或者只对特定域名禁用
|
|
|
go env -w GOSUMDB="sum.golang.org+your-private-git.com"
|
|
|
```
|
|
|
|
|
|
## 四、完整配置示例
|
|
|
|
|
|
### 4.1 项目结构
|
|
|
|
|
|
```
|
|
|
nnet/
|
|
|
├── .git/
|
|
|
├── .gitignore
|
|
|
├── go.mod
|
|
|
├── go.sum
|
|
|
├── scripts/
|
|
|
│ └── push-all.sh
|
|
|
└── README.md
|
|
|
```
|
|
|
|
|
|
### 4.2 Git配置(.git/config)
|
|
|
|
|
|
```ini
|
|
|
[remote "origin"]
|
|
|
url = https://github.com/noahlann/nnet.git
|
|
|
fetch = +refs/heads/*:refs/remotes/origin/*
|
|
|
|
|
|
[remote "gitee"]
|
|
|
url = https://gitee.com/noahlann/nnet.git
|
|
|
fetch = +refs/heads/*:refs/remotes/gitee/*
|
|
|
|
|
|
[remote "private"]
|
|
|
url = https://your-private-git.com/noahlann/nnet.git
|
|
|
fetch = +refs/heads/*:refs/remotes/private/*
|
|
|
|
|
|
[alias]
|
|
|
pushall = !git push origin main && git push gitee main && git push private main
|
|
|
```
|
|
|
|
|
|
### 4.3 go.mod配置
|
|
|
|
|
|
```go
|
|
|
module github.com/noahlann/nnet
|
|
|
|
|
|
go 1.25
|
|
|
|
|
|
require (
|
|
|
github.com/panjf2000/gnet/v2 v2.9.5
|
|
|
)
|
|
|
```
|
|
|
|
|
|
**注意**:使用 GitHub 作为模块路径,无需额外配置。
|
|
|
|
|
|
### 4.4 推送脚本(scripts/push-all.sh)
|
|
|
|
|
|
```bash
|
|
|
#!/bin/bash
|
|
|
|
|
|
set -e
|
|
|
|
|
|
echo "🚀 Pushing to all repositories..."
|
|
|
|
|
|
# 检查是否有未提交的更改
|
|
|
if ! git diff-index --quiet HEAD --; then
|
|
|
echo "⚠️ Warning: You have uncommitted changes"
|
|
|
read -p "Continue anyway? (y/n) " -n 1 -r
|
|
|
echo
|
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
|
exit 1
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
# 获取当前分支
|
|
|
BRANCH=$(git branch --show-current)
|
|
|
|
|
|
echo "📦 Current branch: $BRANCH"
|
|
|
echo ""
|
|
|
|
|
|
# 推送到GitHub
|
|
|
echo "📤 Pushing to GitHub (origin)..."
|
|
|
if git push origin "$BRANCH"; then
|
|
|
echo "✅ GitHub: Success"
|
|
|
else
|
|
|
echo "❌ GitHub: Failed"
|
|
|
exit 1
|
|
|
fi
|
|
|
|
|
|
# 推送到Gitee
|
|
|
echo "📤 Pushing to Gitee..."
|
|
|
if git push gitee "$BRANCH"; then
|
|
|
echo "✅ Gitee: Success"
|
|
|
else
|
|
|
echo "❌ Gitee: Failed"
|
|
|
exit 1
|
|
|
fi
|
|
|
|
|
|
# 推送到私有库
|
|
|
echo "📤 Pushing to Private..."
|
|
|
if git push private "$BRANCH"; then
|
|
|
echo "✅ Private: Success"
|
|
|
else
|
|
|
echo "❌ Private: Failed"
|
|
|
exit 1
|
|
|
fi
|
|
|
|
|
|
echo ""
|
|
|
echo "🎉 All repositories updated successfully!"
|
|
|
```
|
|
|
|
|
|
### 4.5 Makefile配置(可选)
|
|
|
|
|
|
```makefile
|
|
|
.PHONY: push-all
|
|
|
push-all:
|
|
|
@echo "Pushing to all repositories..."
|
|
|
@git push origin main
|
|
|
@git push gitee main
|
|
|
@git push private main
|
|
|
@echo "Done!"
|
|
|
|
|
|
.PHONY: setup-remotes
|
|
|
setup-remotes:
|
|
|
@echo "Setting up remote repositories..."
|
|
|
@git remote add origin https://github.com/noahlann/nnet.git || true
|
|
|
@git remote add gitee https://gitee.com/noahlann/nnet.git || true
|
|
|
@git remote add private https://your-private-git.com/noahlann/nnet.git || true
|
|
|
@echo "Remotes configured!"
|
|
|
|
|
|
.PHONY: sync-all
|
|
|
sync-all: push-all
|
|
|
@echo "Synced to all repositories"
|
|
|
```
|
|
|
|
|
|
使用:
|
|
|
|
|
|
```bash
|
|
|
make push-all
|
|
|
```
|
|
|
|
|
|
## 五、CI/CD配置
|
|
|
|
|
|
### 5.1 GitHub Actions(自动同步到其他仓库)
|
|
|
|
|
|
创建 `.github/workflows/sync-repos.yml`:
|
|
|
|
|
|
```yaml
|
|
|
name: Sync to Multiple Repos
|
|
|
|
|
|
on:
|
|
|
push:
|
|
|
branches: [ main, master ]
|
|
|
workflow_dispatch:
|
|
|
|
|
|
jobs:
|
|
|
sync:
|
|
|
runs-on: ubuntu-latest
|
|
|
steps:
|
|
|
- name: Checkout
|
|
|
uses: actions/checkout@v3
|
|
|
with:
|
|
|
fetch-depth: 0
|
|
|
|
|
|
- name: Push to Gitee
|
|
|
env:
|
|
|
GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }}
|
|
|
run: |
|
|
|
git remote add gitee https://oauth2:${GITEE_TOKEN}@gitee.com/noahlann/nnet.git || true
|
|
|
git push gitee main --force || true
|
|
|
|
|
|
- name: Push to Private
|
|
|
env:
|
|
|
PRIVATE_TOKEN: ${{ secrets.PRIVATE_TOKEN }}
|
|
|
PRIVATE_URL: ${{ secrets.PRIVATE_URL }}
|
|
|
run: |
|
|
|
git remote add private https://oauth2:${PRIVATE_TOKEN}@${PRIVATE_URL}/noahlann/nnet.git || true
|
|
|
git push private main --force || true
|
|
|
```
|
|
|
|
|
|
### 5.2 Gitee Go(Gitee的CI/CD)
|
|
|
|
|
|
创建 `.gitee/workflows/sync.yml`:
|
|
|
|
|
|
```yaml
|
|
|
name: Sync to Other Repos
|
|
|
|
|
|
on:
|
|
|
push:
|
|
|
branches: [ main ]
|
|
|
|
|
|
jobs:
|
|
|
sync:
|
|
|
runs-on: ubuntu-latest
|
|
|
steps:
|
|
|
- name: Checkout
|
|
|
uses: actions/checkout@v3
|
|
|
|
|
|
- name: Push to GitHub
|
|
|
env:
|
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
run: |
|
|
|
git remote add github https://x-access-token:${GITHUB_TOKEN}@github.com/noahlann/nnet.git || true
|
|
|
git push github main --force || true
|
|
|
```
|
|
|
|
|
|
## 六、最佳实践
|
|
|
|
|
|
### 6.1 仓库同步策略
|
|
|
|
|
|
1. **主仓库选择**:
|
|
|
- 选择一个作为"主仓库"(通常是GitHub)
|
|
|
- 其他仓库作为镜像
|
|
|
|
|
|
2. **分支管理**:
|
|
|
- 保持所有仓库的分支结构一致
|
|
|
- 使用相同的分支名称(main/master)
|
|
|
|
|
|
3. **标签同步**:
|
|
|
```bash
|
|
|
# 推送标签到所有仓库
|
|
|
git push origin --tags
|
|
|
git push gitee --tags
|
|
|
git push private --tags
|
|
|
```
|
|
|
|
|
|
### 6.2 权限管理
|
|
|
|
|
|
1. **使用Personal Access Token**:
|
|
|
- GitHub: Settings → Developer settings → Personal access tokens
|
|
|
- Gitee: 设置 → 私人令牌
|
|
|
- 私有库: 根据平台配置
|
|
|
|
|
|
2. **使用SSH密钥**(推荐):
|
|
|
```bash
|
|
|
# 生成SSH密钥
|
|
|
ssh-keygen -t ed25519 -C "your_email@example.com"
|
|
|
|
|
|
# 添加到各个平台
|
|
|
# GitHub: Settings → SSH and GPG keys
|
|
|
# Gitee: 设置 → SSH公钥
|
|
|
```
|
|
|
|
|
|
### 6.3 版本发布流程
|
|
|
|
|
|
```bash
|
|
|
# 1. 创建标签
|
|
|
git tag -a v1.0.0 -m "Release v1.0.0"
|
|
|
|
|
|
# 2. 推送代码和标签到所有仓库
|
|
|
git push origin main --tags
|
|
|
git push gitee main --tags
|
|
|
git push private main --tags
|
|
|
|
|
|
# 3. 在各个平台创建Release
|
|
|
# GitHub: Releases → New release
|
|
|
# Gitee: 发行版 → 新建发行版
|
|
|
```
|
|
|
|
|
|
### 6.4 处理冲突
|
|
|
|
|
|
如果不同仓库有不同的提交:
|
|
|
|
|
|
```bash
|
|
|
# 1. 从主仓库拉取
|
|
|
git pull origin main
|
|
|
|
|
|
# 2. 合并其他仓库的更改
|
|
|
git pull gitee main --allow-unrelated-histories
|
|
|
git pull private main --allow-unrelated-histories
|
|
|
|
|
|
# 3. 解决冲突后推送到所有仓库
|
|
|
git pushall
|
|
|
```
|
|
|
|
|
|
## 七、常见问题
|
|
|
|
|
|
### 7.1 如何只推送到特定仓库?
|
|
|
|
|
|
```bash
|
|
|
# 只推送到GitHub
|
|
|
git push origin main
|
|
|
|
|
|
# 只推送到Gitee
|
|
|
git push gitee main
|
|
|
```
|
|
|
|
|
|
### 7.2 如何删除远程仓库?
|
|
|
|
|
|
```bash
|
|
|
# 删除gitee远程仓库
|
|
|
git remote remove gitee
|
|
|
```
|
|
|
|
|
|
### 7.3 如何查看远程仓库的差异?
|
|
|
|
|
|
```bash
|
|
|
# 查看origin和gitee的差异
|
|
|
git fetch origin
|
|
|
git fetch gitee
|
|
|
git log origin/main..gitee/main
|
|
|
```
|
|
|
|
|
|
### 7.4 如何处理不同仓库的README?
|
|
|
|
|
|
如果需要在不同仓库显示不同的README:
|
|
|
|
|
|
```bash
|
|
|
# 使用分支或文件
|
|
|
# 方案1:使用不同的分支
|
|
|
git checkout -b gitee-readme
|
|
|
# 修改README
|
|
|
git push gitee gitee-readme:main
|
|
|
|
|
|
# 方案2:使用不同的文件名
|
|
|
# README.md (GitHub)
|
|
|
# README.gitee.md (Gitee)
|
|
|
```
|
|
|
|
|
|
## 八、推荐配置
|
|
|
|
|
|
### 8.1 日常开发流程
|
|
|
|
|
|
```bash
|
|
|
# 1. 开发完成后提交
|
|
|
git add .
|
|
|
git commit -m "feat: add new feature"
|
|
|
|
|
|
# 2. 推送到所有仓库
|
|
|
git pushall
|
|
|
# 或
|
|
|
./scripts/push-all.sh
|
|
|
```
|
|
|
|
|
|
### 8.2 版本发布流程
|
|
|
|
|
|
```bash
|
|
|
# 1. 更新版本号
|
|
|
vim version.go
|
|
|
|
|
|
# 2. 提交更改
|
|
|
git add .
|
|
|
git commit -m "chore: bump version to v1.0.0"
|
|
|
|
|
|
# 3. 创建标签
|
|
|
git tag -a v1.0.0 -m "Release v1.0.0"
|
|
|
|
|
|
# 4. 推送所有内容
|
|
|
git pushall
|
|
|
git push origin --tags
|
|
|
git push gitee --tags
|
|
|
git push private --tags
|
|
|
```
|
|
|
|
|
|
## 九、使用提供的脚本
|
|
|
|
|
|
### 9.1 快速配置(推荐)
|
|
|
|
|
|
```bash
|
|
|
# 1. 运行配置脚本
|
|
|
chmod +x scripts/setup-remotes.sh
|
|
|
./scripts/setup-remotes.sh
|
|
|
|
|
|
# 脚本会引导您配置所有远程仓库
|
|
|
```
|
|
|
|
|
|
### 9.2 使用推送脚本
|
|
|
|
|
|
```bash
|
|
|
# 1. 给脚本添加执行权限
|
|
|
chmod +x scripts/push-all.sh
|
|
|
|
|
|
# 2. 推送到所有仓库(使用当前分支)
|
|
|
./scripts/push-all.sh
|
|
|
|
|
|
# 3. 推送到指定分支
|
|
|
./scripts/push-all.sh main
|
|
|
./scripts/push-all.sh develop
|
|
|
```
|
|
|
|
|
|
### 9.3 脚本功能
|
|
|
|
|
|
**push-all.sh** 功能:
|
|
|
- ✅ 自动检测当前分支
|
|
|
- ✅ 检查未提交的更改
|
|
|
- ✅ 验证远程仓库配置
|
|
|
- ✅ 推送到所有配置的仓库
|
|
|
- ✅ 自动推送标签
|
|
|
- ✅ 彩色输出和错误处理
|
|
|
|
|
|
**setup-remotes.sh** 功能:
|
|
|
- ✅ 交互式配置远程仓库
|
|
|
- ✅ 支持更新已存在的远程仓库
|
|
|
- ✅ 自动创建Git别名
|
|
|
- ✅ 验证配置结果
|
|
|
|
|
|
## 十、总结
|
|
|
|
|
|
### 10.1 推荐方案
|
|
|
|
|
|
1. **使用提供的脚本**:`./scripts/setup-remotes.sh` 和 `./scripts/push-all.sh`
|
|
|
2. **使用GitHub作为主路径**:go.mod使用 `github.com/noahlann/nnet`(当前配置)
|
|
|
3. **配置CI/CD自动同步**:减少手动操作
|
|
|
4. **使用SSH密钥**:更安全便捷
|
|
|
|
|
|
### 10.2 快速开始
|
|
|
|
|
|
```bash
|
|
|
# 方式1:使用脚本(推荐)
|
|
|
chmod +x scripts/setup-remotes.sh
|
|
|
./scripts/setup-remotes.sh
|
|
|
|
|
|
# 方式2:手动配置
|
|
|
git remote add origin https://github.com/noahlann/nnet.git
|
|
|
git remote add gitee https://gitee.com/noahlann/nnet.git
|
|
|
git remote add private https://your-private-git.com/noahlann/nnet.git
|
|
|
|
|
|
# 推送
|
|
|
./scripts/push-all.sh
|
|
|
# 或
|
|
|
git pushall # 如果已创建别名
|
|
|
```
|
|
|
|
|
|
### 10.3 工作流程
|
|
|
|
|
|
```bash
|
|
|
# 日常开发
|
|
|
git add .
|
|
|
git commit -m "feat: new feature"
|
|
|
./scripts/push-all.sh
|
|
|
|
|
|
# 版本发布
|
|
|
git tag -a v1.0.0 -m "Release v1.0.0"
|
|
|
./scripts/push-all.sh
|
|
|
git push origin --tags
|
|
|
git push gitee --tags
|
|
|
git push private --tags
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
**文档版本**: v1.0
|
|
|
**最后更新**: 2024
|
|
|
|