Name | trident-sync JSON |
Version |
1.2.2
JSON |
| download |
home_page | |
Summary | 三叉戟,二次开发项目同步升级工具,Secondary development repo sync and upgrade CLI |
upload_time | 2023-02-01 14:37:27 |
maintainer | |
docs_url | None |
author | xiaojunnuo |
requires_python | >=3.8,<4 |
license | MIT |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# 🔱 trident-sync 三叉戟同步
三叉戟同步,是一款异构项目同步升级工具,二次开发同步神器。
[中文](./readme.md)
<div>
<a href="https://gitee.com/handsfree-work/trident-sync" target="_blank"
><img src="https://gitee.com/handsfree-work/trident-sync/badge/star.svg?theme=dark" alt="star"
/></a>
<a href="https://github.com/handsfree-work/trident-sync" target="_blank"
><img alt="GitHub stars" src="https://img.shields.io/github/stars/handsfree-work/trident-sync?logo=github"
/></a>
</div>
## 1. 简介
当我们的项目内部使用了其他项目进行二次开发,那么这个模块就只能停留在当时的版本,无法方便的更新。
本工具可以自动获取变更并合并到你的项目仓库,让二次开发项目可以持续升级。
本工具适用于所有二次开发需要同步更新的场景:
* 直接copy源项目进行二次开发。
* 源项目与你项目目录结构不一致(异构)。
* 源项目本身的submodule过多,一个个fork、merge太麻烦。
* 源项目只是你项目的一个子模块,但你不想用submodule
## 2. 缘起
我有一个 [certd](https://github.com/certd/certd) 项目,这是一个自动更新ssl证书的工具,但这不是重点。
重点是它一开始只是一个独立的命令行工具。
目录结构如下:
```
src
| --packages
| --core
| --plugins
```
某一天我想开发v2版本,把它升级成一个带后台和界面的web项目。
恰好我找到了两个模版项目(其实也是我写的🤭),可以帮我快速实现以上需求。
* [fs-admin-antdv](https://github.com/fast-crud/fs-admin-antdv) (前端admin模版)
* [fs-server-js](https://github.com/fast-crud/fs-server-js) (服务端)
我把这两个项目复制到了`certd`项目中,进行二次开发。
此时`certd`项目目录结构变成如下:
```
src
| --packages
| --core
| --plugins
| --ui
| --certd-client //这是fs-admin-antdv的副本
| --certd-server //这是fs-server-js的副本
```
为了使`certd-client`和`certd-server`能够随时同步`模版项目`的更新
我将使用本项目`trident-sync`来自动帮我升级。
<p align="center">
<img src="./doc/images/trident.png" height="400"/>
<p align="center">像不像个三叉戟🔱?</p>
<p>
## 3. 原理过程
初始化(init):
1. 初始化`同步工作仓库`(sync_work_repo)
2. `clone` `源仓库`(src_repo)和`目标仓库`(target_repo),添加到`同步工作仓库`的`submodule`
3. 给`目标仓库`创建并切换到`同步分支`(sync_branch)
4. 将`源仓库内的文件`复制到`目标仓库对应的目录`,然后`commit、push`
5. 此时`目标仓库`内的`sync_branch`分支拥有`源仓库`的副本
同步(sync):
1. 当`源仓库`有变更时、拉取`源仓库`更新
2. 删除`目标仓库对应的目录`,复制`源仓库所有文件`到`目标仓库对应的目录`
3. 此时`git add . && git commit` 提交的就是`源仓库变更部分`
4. 至此我们成功将`源仓库的更新`转化成了`目标仓库的commit`,后续就是常规的合并操作了。
5. 创建`target.sync_branch` -> `target.main`的`PR`
6. 处理`PR`,合并到开发主分支,升级完成
<p align="center">
<img src="./doc/images/desc.png" />
<p align="center">同步流程图</p>
<p>
> 没有冲突的话,同步过程可以全部自动化。
> 解决冲突是唯一需要手动的部分。
## 4. 快速开始
### 4.1 准备工作
* 安装 [python (3.8+)](https://www.python.org/downloads/)
* 安装 `git`
* 准备你的项目和要同步的源项目
### 4.2 安装本工具
```shell
# 安装本工具,安装成功后就可以使用 trident 命令了
pip install trident-sync --upgrade
```
### 4.3 编写配置文件
* 创建一个同步工作目录,你可以任意命名,接下来都在这个目录下进行操作
```
mkdir sync_work_repo
cd sync_work_repo
```
* 编写`./sync_work_repo/sync.yaml`, 下面是示例,请根据其中注释说明改成你自己的内容
```yaml
# ./sync_work_repo/sync.yaml
repo: # 仓库列表,可以配置多个仓库
fs-admin: # 上游项目1,可以任意命名
url: "https://github.com/fast-crud/fs-admin-antdv" # 源仓库地址
path: "fs-admin-antdv" # submodule保存路径,一般配置仓库名称即可
branch: "main" # 要同步过来的分支
certd: # 你的项目(接受同步项目),可以任意命名
url: "https://github.com/certd/certd" # 目标仓库地址
path: "certd" # submodule保存路径,一般配置仓库名称即可
branch: "dev" # 你的代码开发主分支(接受合并的分支)例如dev、main、v1、v2等
# 以下配置与PR相关,更多关于PR的文档请前往 https://github.com/handsfree-work/trident-sync/tree/main/doc/pr.md
# 第一次使用,你可以暂时不配置,同步完之后需要手动操作合并
token: "" # 仓库的token,用于提交PR
type: github # 仓库类型,用于提交PR,可选项:[github/gitee/gitea]
auto_merge: true # 是否自动合并,如果有冲突则需要手动处理
# 注意: 初始化之后,不要修改url和path,以免出现意外。但是可以添加新的repo.
sync: # 同步配置,可以配置多个同步任务
client: # 同步任务1,可以任意命名
src: # 源仓库
repo: fs-admin # 源仓库名称,上面repo配置的仓库引用
dir: '.' # 要同步给target的目录(不能为空目录)
target: #接受合并的仓库,就是你的项目
repo: certd # 目标仓库名称,上面repo配置的仓库引用
dir: 'package/ui/certd-client' # 接收src同步过来的目录
# ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 如果你之前已经使用源仓库副本做了一部分特性开发,那么这里配置源仓库副本的目录)
branch: 'client_sync' # 同步分支名称(需要配置一个未被占用的分支名称)
options: #其他选项
repo_root: repo # submodule保存根目录
push: false # 同步后是否push
# ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 第一次使用,先本地测试,不push,没问题之后再改成true
pull_request: true # 是否创建pull request,需要目标仓库配置token和type
proxy_fix: true # 是否将https代理改成http://开头,解决python开启代理时无法发出https请求的问题
use_system_proxy: true # 是否使用系统代理
```
### 4.4 初始化
此命令会将`sync_work_repo`目录初始化成一个git仓库,然后将`sync.yaml`中配置的`repo` 添加为`submodule`
```shell
cd sync_work_repo
# 执行初始化操作
trident init
```
<p align="center">
<img src="./doc/images/init.png" />
<p align="center">初始化执行效果</p>
<p>
> 只需运行一次即可,除非你添加了新的`repo`
> 初始化过程会将多个仓库添加为submodule,此步骤在网络不好时容易出问题
> 你可以删除目录下除`sync.yaml`之外的所有文件,重新运行`trident init`命令
### 4.5 进行同步
将根据`sync.yaml`中`sync`配置的同步任务进行同步更新,并提交PR,[你需要视情况处理PR](#5-合并分支)
```shell
# 以后你只需要定时运行这个命令,即可保持同步升级
trident sync
```
运行效果
```
root:~/sync_work_repo$ trident sync
.
.
.
2023-01-28 14:13:41 | INFO | - refs:[<git.Head "refs/heads/main">]
2023-01-28 14:13:41 | WARNING | - Skip push,The remote address is not set for the current repository. Use the [trident remote <repo_url>] command to set the remote address of the repository and save the synchronization progress
2023-01-28 14:13:41 | INFO | - ----------------result:✅----------------
🏹 task --> success:✅ copy:✅ change:✅ commit:✅ push:✅ pr:✅ merge:✅
🔱 sync_work_repo --> change:✅ commit:✅ push:🚫
2023-01-28 14:13:41 | INFO | - ----------------sync end----------------
```
> 注意:不要在同步分支内写你自己的任何代码(示例配置中为`client_sync`分支)
### 4.6 [可选] 保存 sync_work_repo
将`sync_work_repo`push到远程服务器,防止更换电脑丢失同步进度。
后续你只需要`clone` `sync_work_repo` ,然后直接运行`trident sync`即可继续同步
```shell
# 给同步仓库设置远程地址,并push
trident remote --url=<sync_work_repo_git_url>
# 或者运行如下命令,一样的
git remote add origin <sync_work_repo_git_url>
git push
```
> 注意: `sync_work_repo_git_url` 应该是一个新的空的远程仓库
> 如果不是空的,可以加 `-f` 选项强制push(sync_work_repo原有的内容会被覆盖)。
### 4.7 [可选] 定时运行
你可以将 `<sync_work_repo>` 这个远程仓库和 `trident sync` 命令配置到任何`CI/DI`工具(例如jenkins、github
action、drone等)自动定时同步
## 5 合并分支
源仓库如果有更新,那么同步完之后,将会有三种情况:
* 启用了PR: [如何启用PR?](#启用PR)
* 无冲突:自动创建PR,然后自动合并,你无需任何操作
* 有冲突:自动创建PR,然后需要 [手动处理PR](#处理PR)
* 未启用PR:
* 你需要 [手动合并](#手动合并)
#### 启用PR
要启用PR,你需要如下配置
```yaml
repo:
target:
token: xxxx # 创建PR的token
type: github # upstream类型,支持[ github | gitee | gitea ]
auto_merge: true # 是否自动合并
```
[token如何获取?](./doc/pr.md)
#### 处理PR
当PR有冲突时,就需要手动处理冲突,才能合并进入主分支
* 其中 `github` `gitee`支持在web页面直接手动解决冲突
* `gitea`需要线下解决,此时你仍然需要 [手动合并](#手动合并)
#### 手动合并
一般出现冲突了,都建议在IDE上手动进行合并
1. 关闭PR(没有PR的话,请无视)
2. 本地更新所有分支
3. 通过IDE进行分支merge操作(rebase也行,用你平常熟悉的合并分支操作)
```
target:<sync_branch> --------> target:<main_branch>
同步分支 merge 开发主分支
```
#### 避免冲突建议
我们应该尽量避免冲突,请实际开发中遵循以下原则:
1. 尽量不删除、不移动源项目的目录和文件(否则容易造成意想不到的难以解决的冲突)
2. 尽量少在源项目的文件上进行修改(可以改,但尽量少)
3. 新功能和新特性应该写在自己建立的新目录和新文件中
总结就是六个字: 不删、少改、多加。
## 6. 自动化
### 6.1 GitHub Actions
GitHub Actions 可以免费的帮你进行自动化同步操作
请参考 [certd 自动化同步示例](https://github.com/certd/certd-sync-work)
Raw data
{
"_id": null,
"home_page": "",
"name": "trident-sync",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8,<4",
"maintainer_email": "",
"keywords": "",
"author": "xiaojunnuo",
"author_email": "xiaojunnuo@qq.com",
"download_url": "https://files.pythonhosted.org/packages/e6/cc/2baff53684121be2d1727ce2938845e2cd038805734fb883421a50b9d93a/trident_sync-1.2.2.tar.gz",
"platform": null,
"description": "# \ud83d\udd31 trident-sync \u4e09\u53c9\u621f\u540c\u6b65\n\n\u4e09\u53c9\u621f\u540c\u6b65\uff0c\u662f\u4e00\u6b3e\u5f02\u6784\u9879\u76ee\u540c\u6b65\u5347\u7ea7\u5de5\u5177\uff0c\u4e8c\u6b21\u5f00\u53d1\u540c\u6b65\u795e\u5668\u3002\n\n[\u4e2d\u6587](./readme.md)\n\n<div>\n<a href=\"https://gitee.com/handsfree-work/trident-sync\" target=\"_blank\"\n ><img src=\"https://gitee.com/handsfree-work/trident-sync/badge/star.svg?theme=dark\" alt=\"star\"\n/></a> \n<a href=\"https://github.com/handsfree-work/trident-sync\" target=\"_blank\"\n ><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/handsfree-work/trident-sync?logo=github\"\n/></a>\n</div>\n\n## 1. \u7b80\u4ecb\n\n\u5f53\u6211\u4eec\u7684\u9879\u76ee\u5185\u90e8\u4f7f\u7528\u4e86\u5176\u4ed6\u9879\u76ee\u8fdb\u884c\u4e8c\u6b21\u5f00\u53d1\uff0c\u90a3\u4e48\u8fd9\u4e2a\u6a21\u5757\u5c31\u53ea\u80fd\u505c\u7559\u5728\u5f53\u65f6\u7684\u7248\u672c\uff0c\u65e0\u6cd5\u65b9\u4fbf\u7684\u66f4\u65b0\u3002\n\n\u672c\u5de5\u5177\u53ef\u4ee5\u81ea\u52a8\u83b7\u53d6\u53d8\u66f4\u5e76\u5408\u5e76\u5230\u4f60\u7684\u9879\u76ee\u4ed3\u5e93\uff0c\u8ba9\u4e8c\u6b21\u5f00\u53d1\u9879\u76ee\u53ef\u4ee5\u6301\u7eed\u5347\u7ea7\u3002\n\n\u672c\u5de5\u5177\u9002\u7528\u4e8e\u6240\u6709\u4e8c\u6b21\u5f00\u53d1\u9700\u8981\u540c\u6b65\u66f4\u65b0\u7684\u573a\u666f\uff1a\n\n* \u76f4\u63a5copy\u6e90\u9879\u76ee\u8fdb\u884c\u4e8c\u6b21\u5f00\u53d1\u3002\n* \u6e90\u9879\u76ee\u4e0e\u4f60\u9879\u76ee\u76ee\u5f55\u7ed3\u6784\u4e0d\u4e00\u81f4\uff08\u5f02\u6784\uff09\u3002\n* \u6e90\u9879\u76ee\u672c\u8eab\u7684submodule\u8fc7\u591a\uff0c\u4e00\u4e2a\u4e2afork\u3001merge\u592a\u9ebb\u70e6\u3002\n* \u6e90\u9879\u76ee\u53ea\u662f\u4f60\u9879\u76ee\u7684\u4e00\u4e2a\u5b50\u6a21\u5757\uff0c\u4f46\u4f60\u4e0d\u60f3\u7528submodule\n\n## 2. \u7f18\u8d77\n\n\u6211\u6709\u4e00\u4e2a [certd](https://github.com/certd/certd) \u9879\u76ee\uff0c\u8fd9\u662f\u4e00\u4e2a\u81ea\u52a8\u66f4\u65b0ssl\u8bc1\u4e66\u7684\u5de5\u5177\uff0c\u4f46\u8fd9\u4e0d\u662f\u91cd\u70b9\u3002 \n\u91cd\u70b9\u662f\u5b83\u4e00\u5f00\u59cb\u53ea\u662f\u4e00\u4e2a\u72ec\u7acb\u7684\u547d\u4ee4\u884c\u5de5\u5177\u3002 \n\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\uff1a\n\n```\nsrc\n| --packages\n | --core \n | --plugins \n\n```\n\n\u67d0\u4e00\u5929\u6211\u60f3\u5f00\u53d1v2\u7248\u672c\uff0c\u628a\u5b83\u5347\u7ea7\u6210\u4e00\u4e2a\u5e26\u540e\u53f0\u548c\u754c\u9762\u7684web\u9879\u76ee\u3002 \n\u6070\u597d\u6211\u627e\u5230\u4e86\u4e24\u4e2a\u6a21\u7248\u9879\u76ee(\u5176\u5b9e\u4e5f\u662f\u6211\u5199\u7684\ud83e\udd2d),\u53ef\u4ee5\u5e2e\u6211\u5feb\u901f\u5b9e\u73b0\u4ee5\u4e0a\u9700\u6c42\u3002\n\n* [fs-admin-antdv](https://github.com/fast-crud/fs-admin-antdv) \uff08\u524d\u7aefadmin\u6a21\u7248\uff09\n* [fs-server-js](https://github.com/fast-crud/fs-server-js) \uff08\u670d\u52a1\u7aef\uff09\n\n\u6211\u628a\u8fd9\u4e24\u4e2a\u9879\u76ee\u590d\u5236\u5230\u4e86`certd`\u9879\u76ee\u4e2d\uff0c\u8fdb\u884c\u4e8c\u6b21\u5f00\u53d1\u3002 \n\u6b64\u65f6`certd`\u9879\u76ee\u76ee\u5f55\u7ed3\u6784\u53d8\u6210\u5982\u4e0b\uff1a\n\n```\nsrc\n| --packages\n | --core\n | --plugins\n | --ui\n | --certd-client //\u8fd9\u662ffs-admin-antdv\u7684\u526f\u672c\n | --certd-server //\u8fd9\u662ffs-server-js\u7684\u526f\u672c\n```\n\n\u4e3a\u4e86\u4f7f`certd-client`\u548c`certd-server`\u80fd\u591f\u968f\u65f6\u540c\u6b65`\u6a21\u7248\u9879\u76ee`\u7684\u66f4\u65b0 \n\u6211\u5c06\u4f7f\u7528\u672c\u9879\u76ee`trident-sync`\u6765\u81ea\u52a8\u5e2e\u6211\u5347\u7ea7\u3002\n\n<p align=\"center\">\n<img src=\"./doc/images/trident.png\" height=\"400\"/>\n<p align=\"center\">\u50cf\u4e0d\u50cf\u4e2a\u4e09\u53c9\u621f\ud83d\udd31\uff1f</p>\n<p>\n\n## 3. \u539f\u7406\u8fc7\u7a0b\n\n\u521d\u59cb\u5316\uff08init\uff09\uff1a\n\n1. \u521d\u59cb\u5316`\u540c\u6b65\u5de5\u4f5c\u4ed3\u5e93`\uff08sync_work_repo\uff09\n2. `clone` `\u6e90\u4ed3\u5e93`\uff08src_repo\uff09\u548c`\u76ee\u6807\u4ed3\u5e93`\uff08target_repo\uff09\uff0c\u6dfb\u52a0\u5230`\u540c\u6b65\u5de5\u4f5c\u4ed3\u5e93`\u7684`submodule`\n3. \u7ed9`\u76ee\u6807\u4ed3\u5e93`\u521b\u5efa\u5e76\u5207\u6362\u5230`\u540c\u6b65\u5206\u652f`\uff08sync_branch\uff09\n4. \u5c06`\u6e90\u4ed3\u5e93\u5185\u7684\u6587\u4ef6`\u590d\u5236\u5230`\u76ee\u6807\u4ed3\u5e93\u5bf9\u5e94\u7684\u76ee\u5f55`\uff0c\u7136\u540e`commit\u3001push`\n5. \u6b64\u65f6`\u76ee\u6807\u4ed3\u5e93`\u5185\u7684`sync_branch`\u5206\u652f\u62e5\u6709`\u6e90\u4ed3\u5e93`\u7684\u526f\u672c\n\n\u540c\u6b65\uff08sync\uff09\uff1a\n\n1. \u5f53`\u6e90\u4ed3\u5e93`\u6709\u53d8\u66f4\u65f6\u3001\u62c9\u53d6`\u6e90\u4ed3\u5e93`\u66f4\u65b0\n2. \u5220\u9664`\u76ee\u6807\u4ed3\u5e93\u5bf9\u5e94\u7684\u76ee\u5f55`\uff0c\u590d\u5236`\u6e90\u4ed3\u5e93\u6240\u6709\u6587\u4ef6`\u5230`\u76ee\u6807\u4ed3\u5e93\u5bf9\u5e94\u7684\u76ee\u5f55`\n3. \u6b64\u65f6`git add . && git commit` \u63d0\u4ea4\u7684\u5c31\u662f`\u6e90\u4ed3\u5e93\u53d8\u66f4\u90e8\u5206`\n4. \u81f3\u6b64\u6211\u4eec\u6210\u529f\u5c06`\u6e90\u4ed3\u5e93\u7684\u66f4\u65b0`\u8f6c\u5316\u6210\u4e86`\u76ee\u6807\u4ed3\u5e93\u7684commit`\uff0c\u540e\u7eed\u5c31\u662f\u5e38\u89c4\u7684\u5408\u5e76\u64cd\u4f5c\u4e86\u3002\n5. \u521b\u5efa`target.sync_branch` -> `target.main`\u7684`PR`\n6. \u5904\u7406`PR`\uff0c\u5408\u5e76\u5230\u5f00\u53d1\u4e3b\u5206\u652f\uff0c\u5347\u7ea7\u5b8c\u6210\n\n<p align=\"center\">\n<img src=\"./doc/images/desc.png\" />\n<p align=\"center\">\u540c\u6b65\u6d41\u7a0b\u56fe</p>\n<p>\n\n> \u6ca1\u6709\u51b2\u7a81\u7684\u8bdd\uff0c\u540c\u6b65\u8fc7\u7a0b\u53ef\u4ee5\u5168\u90e8\u81ea\u52a8\u5316\u3002 \n> \u89e3\u51b3\u51b2\u7a81\u662f\u552f\u4e00\u9700\u8981\u624b\u52a8\u7684\u90e8\u5206\u3002\n\n## 4. \u5feb\u901f\u5f00\u59cb\n\n### 4.1 \u51c6\u5907\u5de5\u4f5c\n\n* \u5b89\u88c5 [python (3.8+)](https://www.python.org/downloads/)\n* \u5b89\u88c5 `git`\n* \u51c6\u5907\u4f60\u7684\u9879\u76ee\u548c\u8981\u540c\u6b65\u7684\u6e90\u9879\u76ee\n\n### 4.2 \u5b89\u88c5\u672c\u5de5\u5177\n\n```shell\n# \u5b89\u88c5\u672c\u5de5\u5177\uff0c\u5b89\u88c5\u6210\u529f\u540e\u5c31\u53ef\u4ee5\u4f7f\u7528 trident \u547d\u4ee4\u4e86\npip install trident-sync --upgrade\n```\n\n### 4.3 \u7f16\u5199\u914d\u7f6e\u6587\u4ef6\n\n* \u521b\u5efa\u4e00\u4e2a\u540c\u6b65\u5de5\u4f5c\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u63a5\u4e0b\u6765\u90fd\u5728\u8fd9\u4e2a\u76ee\u5f55\u4e0b\u8fdb\u884c\u64cd\u4f5c\n\n```\nmkdir sync_work_repo\ncd sync_work_repo\n```\n\n* \u7f16\u5199`./sync_work_repo/sync.yaml`\uff0c \u4e0b\u9762\u662f\u793a\u4f8b\uff0c\u8bf7\u6839\u636e\u5176\u4e2d\u6ce8\u91ca\u8bf4\u660e\u6539\u6210\u4f60\u81ea\u5df1\u7684\u5185\u5bb9\n\n```yaml\n# ./sync_work_repo/sync.yaml\nrepo: # \u4ed3\u5e93\u5217\u8868\uff0c\u53ef\u4ee5\u914d\u7f6e\u591a\u4e2a\u4ed3\u5e93\n fs-admin: # \u4e0a\u6e38\u9879\u76ee1\uff0c\u53ef\u4ee5\u4efb\u610f\u547d\u540d\n url: \"https://github.com/fast-crud/fs-admin-antdv\" # \u6e90\u4ed3\u5e93\u5730\u5740\n path: \"fs-admin-antdv\" # submodule\u4fdd\u5b58\u8def\u5f84\uff0c\u4e00\u822c\u914d\u7f6e\u4ed3\u5e93\u540d\u79f0\u5373\u53ef\n branch: \"main\" # \u8981\u540c\u6b65\u8fc7\u6765\u7684\u5206\u652f\n certd: # \u4f60\u7684\u9879\u76ee\uff08\u63a5\u53d7\u540c\u6b65\u9879\u76ee\uff09\uff0c\u53ef\u4ee5\u4efb\u610f\u547d\u540d\n url: \"https://github.com/certd/certd\" # \u76ee\u6807\u4ed3\u5e93\u5730\u5740\n path: \"certd\" # submodule\u4fdd\u5b58\u8def\u5f84\uff0c\u4e00\u822c\u914d\u7f6e\u4ed3\u5e93\u540d\u79f0\u5373\u53ef\n branch: \"dev\" # \u4f60\u7684\u4ee3\u7801\u5f00\u53d1\u4e3b\u5206\u652f\uff08\u63a5\u53d7\u5408\u5e76\u7684\u5206\u652f\uff09\u4f8b\u5982dev\u3001main\u3001v1\u3001v2\u7b49\n # \u4ee5\u4e0b\u914d\u7f6e\u4e0ePR\u76f8\u5173\uff0c\u66f4\u591a\u5173\u4e8ePR\u7684\u6587\u6863\u8bf7\u524d\u5f80 https://github.com/handsfree-work/trident-sync/tree/main/doc/pr.md\n # \u7b2c\u4e00\u6b21\u4f7f\u7528\uff0c\u4f60\u53ef\u4ee5\u6682\u65f6\u4e0d\u914d\u7f6e\uff0c\u540c\u6b65\u5b8c\u4e4b\u540e\u9700\u8981\u624b\u52a8\u64cd\u4f5c\u5408\u5e76\n token: \"\" # \u4ed3\u5e93\u7684token\uff0c\u7528\u4e8e\u63d0\u4ea4PR\n type: github # \u4ed3\u5e93\u7c7b\u578b\uff0c\u7528\u4e8e\u63d0\u4ea4PR\uff0c\u53ef\u9009\u9879\uff1a[github/gitee/gitea]\n auto_merge: true # \u662f\u5426\u81ea\u52a8\u5408\u5e76,\u5982\u679c\u6709\u51b2\u7a81\u5219\u9700\u8981\u624b\u52a8\u5904\u7406\n# \u6ce8\u610f\uff1a \u521d\u59cb\u5316\u4e4b\u540e\uff0c\u4e0d\u8981\u4fee\u6539url\u548cpath\uff0c\u4ee5\u514d\u51fa\u73b0\u610f\u5916\u3002\u4f46\u662f\u53ef\u4ee5\u6dfb\u52a0\u65b0\u7684repo.\n\nsync: # \u540c\u6b65\u914d\u7f6e\uff0c\u53ef\u4ee5\u914d\u7f6e\u591a\u4e2a\u540c\u6b65\u4efb\u52a1\n client: # \u540c\u6b65\u4efb\u52a11\uff0c\u53ef\u4ee5\u4efb\u610f\u547d\u540d\n src: # \u6e90\u4ed3\u5e93\n repo: fs-admin # \u6e90\u4ed3\u5e93\u540d\u79f0\uff0c\u4e0a\u9762repo\u914d\u7f6e\u7684\u4ed3\u5e93\u5f15\u7528\n dir: '.' # \u8981\u540c\u6b65\u7ed9target\u7684\u76ee\u5f55\uff08\u4e0d\u80fd\u4e3a\u7a7a\u76ee\u5f55\uff09\n target: #\u63a5\u53d7\u5408\u5e76\u7684\u4ed3\u5e93\uff0c\u5c31\u662f\u4f60\u7684\u9879\u76ee\n repo: certd # \u76ee\u6807\u4ed3\u5e93\u540d\u79f0\uff0c\u4e0a\u9762repo\u914d\u7f6e\u7684\u4ed3\u5e93\u5f15\u7528\n dir: 'package/ui/certd-client' # \u63a5\u6536src\u540c\u6b65\u8fc7\u6765\u7684\u76ee\u5f55\n # \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191 \u5982\u679c\u4f60\u4e4b\u524d\u5df2\u7ecf\u4f7f\u7528\u6e90\u4ed3\u5e93\u526f\u672c\u505a\u4e86\u4e00\u90e8\u5206\u7279\u6027\u5f00\u53d1\uff0c\u90a3\u4e48\u8fd9\u91cc\u914d\u7f6e\u6e90\u4ed3\u5e93\u526f\u672c\u7684\u76ee\u5f55\uff09\n branch: 'client_sync' # \u540c\u6b65\u5206\u652f\u540d\u79f0\uff08\u9700\u8981\u914d\u7f6e\u4e00\u4e2a\u672a\u88ab\u5360\u7528\u7684\u5206\u652f\u540d\u79f0\uff09\n\noptions: #\u5176\u4ed6\u9009\u9879\n repo_root: repo # submodule\u4fdd\u5b58\u6839\u76ee\u5f55\n push: false # \u540c\u6b65\u540e\u662f\u5426push\n # \u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191 \u7b2c\u4e00\u6b21\u4f7f\u7528\uff0c\u5148\u672c\u5730\u6d4b\u8bd5\uff0c\u4e0dpush\uff0c\u6ca1\u95ee\u9898\u4e4b\u540e\u518d\u6539\u6210true\n pull_request: true # \u662f\u5426\u521b\u5efapull request\uff0c\u9700\u8981\u76ee\u6807\u4ed3\u5e93\u914d\u7f6etoken\u548ctype\n proxy_fix: true # \u662f\u5426\u5c06https\u4ee3\u7406\u6539\u6210http://\u5f00\u5934\uff0c\u89e3\u51b3python\u5f00\u542f\u4ee3\u7406\u65f6\u65e0\u6cd5\u53d1\u51fahttps\u8bf7\u6c42\u7684\u95ee\u9898\n use_system_proxy: true # \u662f\u5426\u4f7f\u7528\u7cfb\u7edf\u4ee3\u7406\n\n```\n\n### 4.4 \u521d\u59cb\u5316\n\n\u6b64\u547d\u4ee4\u4f1a\u5c06`sync_work_repo`\u76ee\u5f55\u521d\u59cb\u5316\u6210\u4e00\u4e2agit\u4ed3\u5e93\uff0c\u7136\u540e\u5c06`sync.yaml`\u4e2d\u914d\u7f6e\u7684`repo` \u6dfb\u52a0\u4e3a`submodule`\n\n```shell\ncd sync_work_repo\n# \u6267\u884c\u521d\u59cb\u5316\u64cd\u4f5c\ntrident init \n```\n\n<p align=\"center\">\n<img src=\"./doc/images/init.png\" />\n<p align=\"center\">\u521d\u59cb\u5316\u6267\u884c\u6548\u679c</p>\n<p>\n\n> \u53ea\u9700\u8fd0\u884c\u4e00\u6b21\u5373\u53ef\uff0c\u9664\u975e\u4f60\u6dfb\u52a0\u4e86\u65b0\u7684`repo` \n\n> \u521d\u59cb\u5316\u8fc7\u7a0b\u4f1a\u5c06\u591a\u4e2a\u4ed3\u5e93\u6dfb\u52a0\u4e3asubmodule\uff0c\u6b64\u6b65\u9aa4\u5728\u7f51\u7edc\u4e0d\u597d\u65f6\u5bb9\u6613\u51fa\u95ee\u9898 \n> \u4f60\u53ef\u4ee5\u5220\u9664\u76ee\u5f55\u4e0b\u9664`sync.yaml`\u4e4b\u5916\u7684\u6240\u6709\u6587\u4ef6\uff0c\u91cd\u65b0\u8fd0\u884c`trident init`\u547d\u4ee4\n\n### 4.5 \u8fdb\u884c\u540c\u6b65\n\n\u5c06\u6839\u636e`sync.yaml`\u4e2d`sync`\u914d\u7f6e\u7684\u540c\u6b65\u4efb\u52a1\u8fdb\u884c\u540c\u6b65\u66f4\u65b0\uff0c\u5e76\u63d0\u4ea4PR\uff0c[\u4f60\u9700\u8981\u89c6\u60c5\u51b5\u5904\u7406PR](#5-\u5408\u5e76\u5206\u652f)\n\n```shell\n# \u4ee5\u540e\u4f60\u53ea\u9700\u8981\u5b9a\u65f6\u8fd0\u884c\u8fd9\u4e2a\u547d\u4ee4\uff0c\u5373\u53ef\u4fdd\u6301\u540c\u6b65\u5347\u7ea7\ntrident sync \n```\n\n\u8fd0\u884c\u6548\u679c\n\n```\nroot:~/sync_work_repo$ trident sync \n.\n.\n.\n2023-01-28 14:13:41 | INFO | - refs:[<git.Head \"refs/heads/main\">]\n2023-01-28 14:13:41 | WARNING | - Skip push\uff0cThe remote address is not set for the current repository. Use the [trident remote <repo_url>] command to set the remote address of the repository and save the synchronization progress\n2023-01-28 14:13:41 | INFO | - ----------------result:\u2705----------------\n \ud83c\udff9 task --> success:\u2705 copy:\u2705 change:\u2705 commit:\u2705 push:\u2705 pr:\u2705 merge:\u2705\n \ud83d\udd31 sync_work_repo --> change:\u2705 commit:\u2705 push:\ud83d\udeab \n2023-01-28 14:13:41 | INFO | - ----------------sync end----------------\n```\n\n> \u6ce8\u610f\uff1a\u4e0d\u8981\u5728\u540c\u6b65\u5206\u652f\u5185\u5199\u4f60\u81ea\u5df1\u7684\u4efb\u4f55\u4ee3\u7801\uff08\u793a\u4f8b\u914d\u7f6e\u4e2d\u4e3a`client_sync`\u5206\u652f\uff09\n\n### 4.6 [\u53ef\u9009] \u4fdd\u5b58 sync_work_repo\n\n\u5c06`sync_work_repo`push\u5230\u8fdc\u7a0b\u670d\u52a1\u5668\uff0c\u9632\u6b62\u66f4\u6362\u7535\u8111\u4e22\u5931\u540c\u6b65\u8fdb\u5ea6\u3002 \n\u540e\u7eed\u4f60\u53ea\u9700\u8981`clone` `sync_work_repo` \uff0c\u7136\u540e\u76f4\u63a5\u8fd0\u884c`trident sync`\u5373\u53ef\u7ee7\u7eed\u540c\u6b65\n\n```shell\n# \u7ed9\u540c\u6b65\u4ed3\u5e93\u8bbe\u7f6e\u8fdc\u7a0b\u5730\u5740\uff0c\u5e76push\ntrident remote --url=<sync_work_repo_git_url> \n\n# \u6216\u8005\u8fd0\u884c\u5982\u4e0b\u547d\u4ee4\uff0c\u4e00\u6837\u7684\ngit remote add origin <sync_work_repo_git_url> \ngit push\n```\n\n> \u6ce8\u610f\uff1a `sync_work_repo_git_url` \u5e94\u8be5\u662f\u4e00\u4e2a\u65b0\u7684\u7a7a\u7684\u8fdc\u7a0b\u4ed3\u5e93 \n> \u5982\u679c\u4e0d\u662f\u7a7a\u7684\uff0c\u53ef\u4ee5\u52a0 `-f` \u9009\u9879\u5f3a\u5236push\uff08sync_work_repo\u539f\u6709\u7684\u5185\u5bb9\u4f1a\u88ab\u8986\u76d6\uff09\u3002\n\n### 4.7 [\u53ef\u9009] \u5b9a\u65f6\u8fd0\u884c\n\n\u4f60\u53ef\u4ee5\u5c06 `<sync_work_repo>` \u8fd9\u4e2a\u8fdc\u7a0b\u4ed3\u5e93\u548c `trident sync` \u547d\u4ee4\u914d\u7f6e\u5230\u4efb\u4f55`CI/DI`\u5de5\u5177\uff08\u4f8b\u5982jenkins\u3001github\naction\u3001drone\u7b49\uff09\u81ea\u52a8\u5b9a\u65f6\u540c\u6b65\n\n## 5 \u5408\u5e76\u5206\u652f\n\n\u6e90\u4ed3\u5e93\u5982\u679c\u6709\u66f4\u65b0\uff0c\u90a3\u4e48\u540c\u6b65\u5b8c\u4e4b\u540e\uff0c\u5c06\u4f1a\u6709\u4e09\u79cd\u60c5\u51b5\uff1a\n\n* \u542f\u7528\u4e86PR\uff1a [\u5982\u4f55\u542f\u7528PR\uff1f](#\u542f\u7528PR)\n * \u65e0\u51b2\u7a81\uff1a\u81ea\u52a8\u521b\u5efaPR\uff0c\u7136\u540e\u81ea\u52a8\u5408\u5e76\uff0c\u4f60\u65e0\u9700\u4efb\u4f55\u64cd\u4f5c\n * \u6709\u51b2\u7a81\uff1a\u81ea\u52a8\u521b\u5efaPR\uff0c\u7136\u540e\u9700\u8981 [\u624b\u52a8\u5904\u7406PR](#\u5904\u7406PR)\n* \u672a\u542f\u7528PR\uff1a\n * \u4f60\u9700\u8981 [\u624b\u52a8\u5408\u5e76](#\u624b\u52a8\u5408\u5e76)\n\n#### \u542f\u7528PR\n\n\u8981\u542f\u7528PR\uff0c\u4f60\u9700\u8981\u5982\u4e0b\u914d\u7f6e\n\n```yaml\nrepo:\n target:\n token: xxxx # \u521b\u5efaPR\u7684token\n type: github # upstream\u7c7b\u578b\uff0c\u652f\u6301[ github | gitee | gitea ]\n auto_merge: true # \u662f\u5426\u81ea\u52a8\u5408\u5e76\n\n```\n\n[token\u5982\u4f55\u83b7\u53d6\uff1f](./doc/pr.md)\n\n#### \u5904\u7406PR\n\n\u5f53PR\u6709\u51b2\u7a81\u65f6\uff0c\u5c31\u9700\u8981\u624b\u52a8\u5904\u7406\u51b2\u7a81\uff0c\u624d\u80fd\u5408\u5e76\u8fdb\u5165\u4e3b\u5206\u652f\n\n* \u5176\u4e2d `github` `gitee`\u652f\u6301\u5728web\u9875\u9762\u76f4\u63a5\u624b\u52a8\u89e3\u51b3\u51b2\u7a81\n* `gitea`\u9700\u8981\u7ebf\u4e0b\u89e3\u51b3\uff0c\u6b64\u65f6\u4f60\u4ecd\u7136\u9700\u8981 [\u624b\u52a8\u5408\u5e76](#\u624b\u52a8\u5408\u5e76)\n\n#### \u624b\u52a8\u5408\u5e76\n\n\u4e00\u822c\u51fa\u73b0\u51b2\u7a81\u4e86\uff0c\u90fd\u5efa\u8bae\u5728IDE\u4e0a\u624b\u52a8\u8fdb\u884c\u5408\u5e76\n\n1. \u5173\u95edPR\uff08\u6ca1\u6709PR\u7684\u8bdd\uff0c\u8bf7\u65e0\u89c6\uff09\n2. \u672c\u5730\u66f4\u65b0\u6240\u6709\u5206\u652f\n3. \u901a\u8fc7IDE\u8fdb\u884c\u5206\u652fmerge\u64cd\u4f5c\uff08rebase\u4e5f\u884c\uff0c\u7528\u4f60\u5e73\u5e38\u719f\u6089\u7684\u5408\u5e76\u5206\u652f\u64cd\u4f5c\uff09\n\n```\ntarget:<sync_branch> --------> target:<main_branch>\n \u540c\u6b65\u5206\u652f merge \u5f00\u53d1\u4e3b\u5206\u652f\n```\n\n#### \u907f\u514d\u51b2\u7a81\u5efa\u8bae\n\n\u6211\u4eec\u5e94\u8be5\u5c3d\u91cf\u907f\u514d\u51b2\u7a81\uff0c\u8bf7\u5b9e\u9645\u5f00\u53d1\u4e2d\u9075\u5faa\u4ee5\u4e0b\u539f\u5219\uff1a\n\n1. \u5c3d\u91cf\u4e0d\u5220\u9664\u3001\u4e0d\u79fb\u52a8\u6e90\u9879\u76ee\u7684\u76ee\u5f55\u548c\u6587\u4ef6\uff08\u5426\u5219\u5bb9\u6613\u9020\u6210\u610f\u60f3\u4e0d\u5230\u7684\u96be\u4ee5\u89e3\u51b3\u7684\u51b2\u7a81\uff09\n2. \u5c3d\u91cf\u5c11\u5728\u6e90\u9879\u76ee\u7684\u6587\u4ef6\u4e0a\u8fdb\u884c\u4fee\u6539\uff08\u53ef\u4ee5\u6539\uff0c\u4f46\u5c3d\u91cf\u5c11\uff09\n3. \u65b0\u529f\u80fd\u548c\u65b0\u7279\u6027\u5e94\u8be5\u5199\u5728\u81ea\u5df1\u5efa\u7acb\u7684\u65b0\u76ee\u5f55\u548c\u65b0\u6587\u4ef6\u4e2d\n\n\u603b\u7ed3\u5c31\u662f\u516d\u4e2a\u5b57\uff1a \u4e0d\u5220\u3001\u5c11\u6539\u3001\u591a\u52a0\u3002\n\n## 6. \u81ea\u52a8\u5316\n\n### 6.1 GitHub Actions\nGitHub Actions \u53ef\u4ee5\u514d\u8d39\u7684\u5e2e\u4f60\u8fdb\u884c\u81ea\u52a8\u5316\u540c\u6b65\u64cd\u4f5c\n\n\u8bf7\u53c2\u8003 [certd \u81ea\u52a8\u5316\u540c\u6b65\u793a\u4f8b](https://github.com/certd/certd-sync-work)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u4e09\u53c9\u621f\uff0c\u4e8c\u6b21\u5f00\u53d1\u9879\u76ee\u540c\u6b65\u5347\u7ea7\u5de5\u5177\uff0cSecondary development repo sync and upgrade CLI",
"version": "1.2.2",
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "58d563f2a1fc57cc25d92d6b6aca88f2cf25a04ff671f122f8f6d915d8479056",
"md5": "e86d194381836858a9bcf2232bb68c44",
"sha256": "36660599c3ee4b17117ed7c4081b6d1bc0a751a3456a93478fcbdfe4f0692083"
},
"downloads": -1,
"filename": "trident_sync-1.2.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e86d194381836858a9bcf2232bb68c44",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8,<4",
"size": 27563,
"upload_time": "2023-02-01T14:37:25",
"upload_time_iso_8601": "2023-02-01T14:37:25.367325Z",
"url": "https://files.pythonhosted.org/packages/58/d5/63f2a1fc57cc25d92d6b6aca88f2cf25a04ff671f122f8f6d915d8479056/trident_sync-1.2.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e6cc2baff53684121be2d1727ce2938845e2cd038805734fb883421a50b9d93a",
"md5": "9aba67bf6c96a287f87eb7fea963205c",
"sha256": "4856a251f0524473ea588b4ebc64f4debc5d5e86324e3f45723a73d0e0bfb71b"
},
"downloads": -1,
"filename": "trident_sync-1.2.2.tar.gz",
"has_sig": false,
"md5_digest": "9aba67bf6c96a287f87eb7fea963205c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8,<4",
"size": 21700,
"upload_time": "2023-02-01T14:37:27",
"upload_time_iso_8601": "2023-02-01T14:37:27.018795Z",
"url": "https://files.pythonhosted.org/packages/e6/cc/2baff53684121be2d1727ce2938845e2cd038805734fb883421a50b9d93a/trident_sync-1.2.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-02-01 14:37:27",
"github": false,
"gitlab": false,
"bitbucket": false,
"lcname": "trident-sync"
}