mirror of
https://github.com/GXDE-OS/GXDE.git
synced 2026-11-13 13:21:03 +08:00
Compare commits
9
Commits
2026.10.26
...
2026.11.11
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
251559cabd | ||
|
|
3d860518b3 | ||
|
|
8312e04ea3 | ||
|
|
2fe440700e | ||
|
|
185393978c | ||
|
|
7262370817 | ||
|
|
8feea0d874 | ||
|
|
a86f7295f5 | ||
|
|
956d02d42d |
@@ -1,4 +1,4 @@
|
|||||||
name: Synch Gitee To Github
|
name: Synch Github To Gitee
|
||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@@ -25,6 +25,5 @@ jobs:
|
|||||||
GITEEUSER: ${{ secrets.GITEEUSER }}
|
GITEEUSER: ${{ secrets.GITEEUSER }}
|
||||||
GITEETOCKEN: ${{ secrets.GITEETOCKEN }}
|
GITEETOCKEN: ${{ secrets.GITEETOCKEN }}
|
||||||
run: |
|
run: |
|
||||||
cd sync-gitee-to-github
|
cd sync-github-to-gitee
|
||||||
python3 sync.py $GITEEUSER $GITEETOCKEN $GITHUBUSER $GITHUBTOKEN
|
python3 sync.py "$GITHUBUSER" "$GITHUBTOKEN" "$GITEEUSER" "$GITEETOCKEN"
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,20 @@
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div style="float: left; display: flex; align-items: center" >
|
<div style="float: left; display: flex; align-items: center" >
|
||||||
|
<a href='https://github.com/GXDE-OS'><img alt="GitHub Org's stars" src="https://img.shields.io/github/stars/GXDE-OS?style=flat&logo=github"></a>
|
||||||
|
<a href='https://github.com/orgs/GXDE-OS/followers'><img alt="GitHub followers" src="https://img.shields.io/github/followers/GXDE-OS?style=flat&logo=github"></a>
|
||||||
<a href='https://gitee.com/GXDE-OS/GXDE/stargazers'><img src='https://gitee.com/GXDE-OS/GXDE/badge/star.svg?theme=dark' alt='star'></img></a>
|
<a href='https://gitee.com/GXDE-OS/GXDE/stargazers'><img src='https://gitee.com/GXDE-OS/GXDE/badge/star.svg?theme=dark' alt='star'></img></a>
|
||||||
<img src='https://gitcode.com/GXDE-OS/GXDE/star/badge.svg' alt='G-Star'></img>
|
<img src='https://gitcode.com/GXDE-OS/GXDE/star/badge.svg' alt='G-Star'></img>
|
||||||
|
<a href='https://sourceforge.net/projects/gxde-os/'><img src='https://img.shields.io/sourceforge/dw/gxde-os?style=flat&logo=sourceforge' alt='Sourceforge'></img></a>
|
||||||
</div>
|
</div>
|
||||||
<div style="float: right">
|
<div style="float: right">
|
||||||
<a href="./README.zh.md">中文版</a>
|
<a href="./README.zh.md">中文版</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
**Note: Following internal discussion, it has been decided that from now on GXDE will be primarily hosted on GitHub, with Gitee used only for mirror synchronisation.**
|
||||||
|
**Please submit Issues and PRs to the relevant GXDE GitHub repositories.**
|
||||||
|
**GitHub repository: http://github.com/GXDE-OS/GXDE**
|
||||||
|
|
||||||
## Welcome to GXDE OS Community
|
## Welcome to GXDE OS Community
|
||||||
|
|
||||||
@@ -39,7 +45,10 @@ Please Click the Star in the Upper Right Corner, Your Support is Our Greatest Mo
|
|||||||
### User Group
|
### User Group
|
||||||
<center><img src=new-logo-long.png width=300/></center>
|
<center><img src=new-logo-long.png width=300/></center>
|
||||||
|
|
||||||
QQ Group: 881201853
|
QQ Groups:
|
||||||
|
Group 1: 881201853
|
||||||
|
Group 2: 712629637
|
||||||
|
Beta feedback group: 1129752588
|
||||||
Discord: https://discord.gg/t5Uf2xYpvA
|
Discord: https://discord.gg/t5Uf2xYpvA
|
||||||
Forum: https://bbs.spark-app.store/
|
Forum: https://bbs.spark-app.store/
|
||||||
|
|
||||||
|
|||||||
+10
-1
@@ -2,14 +2,20 @@
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div style="float: left; display: flex; align-items: center" >
|
<div style="float: left; display: flex; align-items: center" >
|
||||||
|
<a href='https://github.com/GXDE-OS'><img alt="GitHub Org's stars" src="https://img.shields.io/github/stars/GXDE-OS?style=flat&logo=github"></a>
|
||||||
|
<a href='https://github.com/orgs/GXDE-OS/followers'><img alt="GitHub followers" src="https://img.shields.io/github/followers/GXDE-OS?style=flat&logo=github"></a>
|
||||||
<a href='https://gitee.com/GXDE-OS/GXDE/stargazers'><img src='https://gitee.com/GXDE-OS/GXDE/badge/star.svg?theme=dark' alt='star'></img></a>
|
<a href='https://gitee.com/GXDE-OS/GXDE/stargazers'><img src='https://gitee.com/GXDE-OS/GXDE/badge/star.svg?theme=dark' alt='star'></img></a>
|
||||||
<img src='https://gitcode.com/GXDE-OS/GXDE/star/badge.svg' alt='G-Star'></img>
|
<img src='https://gitcode.com/GXDE-OS/GXDE/star/badge.svg' alt='G-Star'></img>
|
||||||
|
<a href='https://sourceforge.net/projects/gxde-os/'><img src='https://img.shields.io/sourceforge/dw/gxde-os?style=flat&logo=sourceforge' alt='Sourceforge'></img></a>
|
||||||
</div>
|
</div>
|
||||||
<div style="float: right">
|
<div style="float: right">
|
||||||
<a href="./README.md">English Version</a>
|
<a href="./README.md">English Version</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
**注:经过组织内部沟通决定,从现在开始 GXDE 将主要托管至 Github,Gitee 只做镜像同步。**
|
||||||
|
**Issues 和 Pr 请提交至 GXDE Github 相关仓库**
|
||||||
|
**Github 仓库:http://github.com/GXDE-OS/GXDE**
|
||||||
|
|
||||||
## 简介
|
## 简介
|
||||||
|
|
||||||
@@ -33,7 +39,10 @@ GXDE OS 内置 [星火应用商店](https://gitee.com/spark-store-project/),
|
|||||||
|
|
||||||
### 沟通渠道
|
### 沟通渠道
|
||||||
|
|
||||||
QQ 群:881201853
|
QQ 群:
|
||||||
|
1 群:881201853
|
||||||
|
2 群:712629637
|
||||||
|
内测反馈群:1129752588
|
||||||
Discord:https://discord.gg/t5Uf2xYpvA
|
Discord:https://discord.gg/t5Uf2xYpvA
|
||||||
论坛:https://bbs.spark-app.store/
|
论坛:https://bbs.spark-app.store/
|
||||||
|
|
||||||
|
|||||||
Vendored
+6
@@ -1,3 +1,9 @@
|
|||||||
|
gxde (2026.11.11) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* 新增 gxde-lock 作为新的锁屏模块
|
||||||
|
|
||||||
|
-- CharOfString <root@charofstring.cc> Wed, 11 Nov 2026 19:56:05 -0600
|
||||||
|
|
||||||
gxde (2026.10.26) UNRELEASED; urgency=medium
|
gxde (2026.10.26) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
* 新增 remmina 以解决远程问题
|
* 新增 remmina 以解决远程问题
|
||||||
|
|||||||
Vendored
+1
@@ -123,6 +123,7 @@ Depends: ${misc:Depends},
|
|||||||
gxde-default-settings,
|
gxde-default-settings,
|
||||||
gxde-shell-tools,
|
gxde-shell-tools,
|
||||||
gxde-compressor,
|
gxde-compressor,
|
||||||
|
gxde-lock,
|
||||||
Recommends:
|
Recommends:
|
||||||
gxde-desktop-extra | gxde-desktop-android,
|
gxde-desktop-extra | gxde-desktop-android,
|
||||||
gxde-editor,
|
gxde-editor,
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""
|
"""
|
||||||
将 Gitee 上的 GXDE-OS 组织仓库镜像同步到 GitHub(GXDE-OS 组织)。
|
将 GitHub 上的 GXDE-OS 组织仓库镜像同步到 Gitee(GXDE-OS 组织)。
|
||||||
|
|
||||||
用法:
|
用法:
|
||||||
python3 sync.py <gitee用户名> <gitee密码或Token> <github用户名> <githubToken>
|
python3 sync.py <github用户名> <githubToken> <gitee用户名> <gitee密码或Token>
|
||||||
|
|
||||||
流程:
|
流程:
|
||||||
1. 通过 Gitee API v5 分页获取 GXDE-OS 组织下的全部仓库列表(带 token 失败时回退匿名)
|
1. 通过 GitHub REST API 分页获取 GXDE-OS 组织下的全部仓库列表(带 token 失败时回退匿名)
|
||||||
2. 多线程 clone --bare 拉取 Gitee 仓库
|
2. 多线程 clone --bare 拉取 GitHub 仓库
|
||||||
3. 逐个 push --mirror 推送到 GitHub,失败自动重试并在结束时汇总报告
|
3. 逐个 push --mirror 推送到 Gitee,失败自动重试并在结束时汇总报告
|
||||||
|
|
||||||
|
注意:
|
||||||
|
- Gitee 侧的同名仓库需要预先存在,push --mirror 会覆盖其分支与标签
|
||||||
|
- GitHub 只接受 Personal Access Token 作为密码(需具备组织仓库的读取权限)
|
||||||
"""
|
"""
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
@@ -28,36 +32,42 @@ threadMax = 8
|
|||||||
|
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print("用法: python3 sync.py <gitee用户名> <gitee密码或Token> <github用户名> <githubToken>")
|
print("用法: python3 sync.py <github用户名> <githubToken> <gitee用户名> <gitee密码或Token>")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
def apiGet(path, params):
|
def apiGet(path, params, token):
|
||||||
"""调用 Gitee API v5 的单个请求"""
|
"""调用 GitHub REST API 的单个请求"""
|
||||||
params["per_page"] = str(perPage)
|
params["per_page"] = str(perPage)
|
||||||
url = "https://gitee.com/api/v5" + path + "?" + urllib.parse.urlencode(params)
|
url = "https://api.github.com" + path + "?" + urllib.parse.urlencode(params)
|
||||||
req = urllib.request.Request(url, headers={"User-Agent": "GXDE-Sync/1.0"})
|
headers = {
|
||||||
|
"User-Agent": "GXDE-Sync/1.0",
|
||||||
|
"Accept": "application/vnd.github+json",
|
||||||
|
"X-GitHub-Api-Version": "2022-11-28",
|
||||||
|
}
|
||||||
|
if token:
|
||||||
|
headers["Authorization"] = "Bearer " + token
|
||||||
|
req = urllib.request.Request(url, headers=headers)
|
||||||
with urllib.request.urlopen(req, timeout=30) as resp:
|
with urllib.request.urlopen(req, timeout=30) as resp:
|
||||||
return json.loads(resp.read().decode("utf-8"))
|
return json.loads(resp.read().decode("utf-8"))
|
||||||
|
|
||||||
|
|
||||||
def getGiteeRepos(token):
|
def getGithubRepos(token):
|
||||||
"""分页获取 Gitee 组织下全部仓库的 path(URL 安全路径)
|
"""分页获取 GitHub 组织下全部仓库的 name(即 URL 路径中的仓库名)
|
||||||
|
|
||||||
Gitee API 返回的 name 是仓库别名(可能含大写、中文或括号,如
|
带 token 时 type=all 可包含私有仓库;匿名请求只返回公开仓库。
|
||||||
"CTranslate2"),不能直接用作 clone URL 的路径组件;path 才是 URL
|
GitHub 的 name 可直接拼接 clone/push URL,无需像 Gitee 那样取 path 字段。
|
||||||
安全的仓库路径(如 "ctranslate2"),用它拼接 clone/push URL 才合法。
|
|
||||||
"""
|
"""
|
||||||
repoList = []
|
repoList = []
|
||||||
page = 1
|
page = 1
|
||||||
while True:
|
while True:
|
||||||
params = {"page": str(page)}
|
params = {"page": str(page), "type": "all"}
|
||||||
if token:
|
data = apiGet(f"/orgs/{orgName}/repos", params, token)
|
||||||
params["access_token"] = token
|
|
||||||
data = apiGet(f"/orgs/{orgName}/repos", params)
|
|
||||||
if not isinstance(data, list) or len(data) == 0:
|
if not isinstance(data, list) or len(data) == 0:
|
||||||
break
|
break
|
||||||
repoList.extend([i["path"] for i in data])
|
repoList.extend([i["name"] for i in data])
|
||||||
|
if len(data) < perPage:
|
||||||
|
break
|
||||||
page += 1
|
page += 1
|
||||||
return repoList
|
return repoList
|
||||||
|
|
||||||
@@ -70,7 +80,7 @@ def runGit(args, cwd=None):
|
|||||||
def syncRepo(name, pullUrl, pushUrl):
|
def syncRepo(name, pullUrl, pushUrl):
|
||||||
repoDir = os.path.join(cloneDir, name + ".git")
|
repoDir = os.path.join(cloneDir, name + ".git")
|
||||||
try:
|
try:
|
||||||
# 1. 从 Gitee clone --bare(重试 3 次)
|
# 1. 从 GitHub clone --bare(重试 3 次)
|
||||||
ok = False
|
ok = False
|
||||||
lastOut = ""
|
lastOut = ""
|
||||||
for attempt in range(3):
|
for attempt in range(3):
|
||||||
@@ -84,7 +94,7 @@ def syncRepo(name, pullUrl, pushUrl):
|
|||||||
print(f"[FAIL] clone 失败: {name}\n{lastOut}")
|
print(f"[FAIL] clone 失败: {name}\n{lastOut}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# 2. push --mirror 到 GitHub(重试 3 次)
|
# 2. push --mirror 到 Gitee(重试 3 次)
|
||||||
ok = False
|
ok = False
|
||||||
lastOut = ""
|
lastOut = ""
|
||||||
for attempt in range(3):
|
for attempt in range(3):
|
||||||
@@ -108,19 +118,21 @@ def syncRepo(name, pullUrl, pushUrl):
|
|||||||
def main():
|
def main():
|
||||||
if len(sys.argv) < 5:
|
if len(sys.argv) < 5:
|
||||||
usage()
|
usage()
|
||||||
giteeUser, giteeToken = sys.argv[1], sys.argv[2]
|
githubUser, githubToken = sys.argv[1], sys.argv[2]
|
||||||
githubUser, githubToken = sys.argv[3], sys.argv[4]
|
giteeUser, giteeToken = sys.argv[3], sys.argv[4]
|
||||||
|
|
||||||
pullUrl = f"https://{urllib.parse.quote(giteeUser)}:{urllib.parse.quote(giteeToken)}@gitee.com/{orgName}/"
|
githubAuth = urllib.parse.quote(githubUser, safe="") + ":" + urllib.parse.quote(githubToken, safe="")
|
||||||
pushUrl = f"https://{urllib.parse.quote(githubUser)}:{urllib.parse.quote(githubToken)}@github.com/{orgName}/"
|
giteeAuth = urllib.parse.quote(giteeUser, safe="") + ":" + urllib.parse.quote(giteeToken, safe="")
|
||||||
|
pullUrl = f"https://{githubAuth}@github.com/{orgName}/"
|
||||||
|
pushUrl = f"https://{giteeAuth}@gitee.com/{orgName}/"
|
||||||
|
|
||||||
os.makedirs(cloneDir, exist_ok=True)
|
os.makedirs(cloneDir, exist_ok=True)
|
||||||
|
|
||||||
# 获取仓库列表:优先带 token,失败则回退到匿名(仅公开仓库)
|
# 获取仓库列表:优先带 token(可含私有仓库),失败则回退到匿名(仅公开仓库)
|
||||||
try:
|
try:
|
||||||
repoList = getGiteeRepos(giteeToken)
|
repoList = getGithubRepos(githubToken)
|
||||||
except Exception:
|
except Exception:
|
||||||
repoList = getGiteeRepos("")
|
repoList = getGithubRepos("")
|
||||||
print(f"共获取到 {len(repoList)} 个仓库")
|
print(f"共获取到 {len(repoList)} 个仓库")
|
||||||
if not repoList:
|
if not repoList:
|
||||||
print("未能获取仓库列表,退出")
|
print("未能获取仓库列表,退出")
|
||||||
Reference in New Issue
Block a user