Compare commits

...
25 Commits
Author SHA1 Message Date
gfdgd-xi cb28036eec 移除依赖星火动态壁纸
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-26 21:58:50 +08:00
gfdgd-xi e05436265a debian rootfs环境内置包qt6-base-dev,qt6-base-private-dev
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-26 19:45:18 +08:00
gfdgd-xi 4d67c0c2f0 Revert "使用解压rootfs替代debootstrap,提升速度"
This reverts commit cec74ff92c.

Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-26 19:41:50 +08:00
gfdgd-xi cec74ff92c 使用解压rootfs替代debootstrap,提升速度
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-26 19:25:28 +08:00
gfdgd-xi e094939b96 移除交叉编译hetao构建
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-16 22:12:09 +08:00
gfdgd-xi 3ae20c5867 移除核桃构建
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-15 13:55:16 +08:00
CharOfString ff4666cd2c fix: ACSII art display issue 2026-10-11 22:03:33 -05:00
CharOfStringandClaude Opus 5.5 2fe5b8b9d1 chore: Hide Arch repo update output
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:22:49 -05:00
CharOfString a23074725a exp: Fix arch pkg upload 2026-10-10 21:12:24 -05:00
CharOfStringandClaude Opus 5.5 7e1d43b057 fix: Show Arch repo update output
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:06:11 -05:00
CharOfString bf87ba2f2b fix: AARCH64 Archlinux build 2026-10-10 19:45:04 -05:00
CharOfString c215251f38 fix: Arch building 2026-10-10 19:34:28 -05:00
CharOfString d8c5ea88e0 add: Build Archlinux 2026-10-10 18:40:39 -05:00
gfdgd-xi 09945e156a feat: 新增推荐依赖gxdm-emergency-mode, gxde-freewb, fcitx5-theme-deepin
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-10-04 20:40:59 +08:00
CharOfString 64f4c6b4b3 chore(CharOfString): 更新提交邮箱 2026-09-22 11:38:41 -05:00
shenmo7192andGitee e4d7046327 extra add filetransfer
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-08-25 13:50:47 +00:00
shenmo7192andGitee 4130492385 add GXDE Wayland PreInstalled
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-08-23 12:40:06 +00:00
gfdgd-xi 87ee719ea4 新增推荐依赖gxde-dlna-caster
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-08-11 07:58:55 +08:00
gfdgd-xi 23aba101a6 添加推荐依赖deepin-liferaft
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-08-06 18:08:37 +08:00
shenmo7192 8ee15d5725 fix(sync.py): 修正Gitee仓库名称获取逻辑,使用安全路径
Gitee的name字段可能包含非法字符,改用path作为仓库URL安全路径,确保clone/push URL合法
2026-08-03 19:39:56 +08:00
shenmo7192 a6f6c26fb9 ci(github workflow): simplify sync workflow and rewrite sync script
1. 移除多余的第三方同步目标和依赖包
2. 将原bash脚本重写为python脚本,新增多线程同步、失败重试和同步报告
3. 精简工作流的环境变量和执行参数
2026-08-03 19:16:34 +08:00
gfdgd-xi eebd5d7817 修复github项目页图片缺失的问题
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-07-29 09:49:43 +08:00
gfdgd-xi dd3d0e1a34 使用gitee令牌拉取仓库
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-07-25 18:28:20 +08:00
CharOfString 73a77bb9ca polish: README 2026-07-24 00:08:32 +08:00
gfdgd-xi 96feeb840f 调整ssh加密方式
Signed-off-by: gfdgd_xi <3025613752@qq.com>
2026-07-14 11:23:59 +08:00
20 changed files with 623 additions and 98 deletions
@@ -140,10 +140,8 @@ jobs:
mkdir -p ~/.ssh/ mkdir -p ~/.ssh/
ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts
tarName=$(ls | grep .tar | head -n 1) tarName=$(ls | grep .tar | head -n 1)
sudo sysctl -w net.ipv4.tcp_mtu_probing=1 sshpass -p "$UPASSWD" rsync -e "ssh -p $UPORT" $tarName $UUSERS@$UHOST:$UPATH
sshpass -p "$UPASSWD" scp -o HostKeyAlgorithms=ecdsa-sha2-nistp256 -o KexAlgorithms=ecdh-sha2-nistp256 -c aes128-ctr -O $tarName $UUSERS@$UHOST:$UPATH sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -p $UPORT $UPROGRAM ${{ inputs.gxde-codename-upload }} $UPATH/$tarName > /dev/null
sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -o HostKeyAlgorithms=ecdsa-sha2-nistp256 -o KexAlgorithms=ecdh-sha2-nistp256 -c aes128-ctr -p $UPORT $UPROGRAM ${{ inputs.gxde-codename-upload }} $UPATH/$tarName > /dev/null
sudo sysctl -w net.ipv4.tcp_mtu_probing=0
- name: Create Release - name: Create Release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
+2 -4
View File
@@ -141,10 +141,8 @@ jobs:
mkdir -p ~/.ssh/ mkdir -p ~/.ssh/
ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts
tarName=$(ls | grep .tar | head -n 1) tarName=$(ls | grep .tar | head -n 1)
sudo sysctl -w net.ipv4.tcp_mtu_probing=1 sshpass -p "$UPASSWD" rsync -e "ssh -p $UPORT" $tarName $UUSERS@$UHOST:$UPATH
sshpass -p "$UPASSWD" scp -o HostKeyAlgorithms=ecdsa-sha2-nistp256 -o KexAlgorithms=ecdh-sha2-nistp256 -c aes128-ctr -O $tarName $UUSERS@$UHOST:$UPATH sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -p $UPORT $UPROGRAM ${{ inputs.gxde-codename-upload }} $UPATH/$tarName > /dev/null
sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -o HostKeyAlgorithms=ecdsa-sha2-nistp256 -o KexAlgorithms=ecdh-sha2-nistp256 -c aes128-ctr -p $UPORT $UPROGRAM ${{ inputs.gxde-codename-upload }} $UPATH/$tarName > /dev/null
sudo sysctl -w net.ipv4.tcp_mtu_probing=0
- name: Create Release - name: Create Release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
@@ -25,7 +25,3 @@ jobs:
call-zhuangzhuang: call-zhuangzhuang:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross-host.yml@master uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross-host.yml@master
secrets: inherit secrets: inherit
call-hetao:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao-cross-host.yml@master
secrets: inherit
-4
View File
@@ -25,7 +25,3 @@ jobs:
call-zhuangzhuang: call-zhuangzhuang:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross.yml@master uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang-cross.yml@master
secrets: inherit secrets: inherit
call-hetao:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao-cross.yml@master
secrets: inherit
+2 -2
View File
@@ -26,7 +26,7 @@ jobs:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang.yml@master uses: GXDE-OS/GXDE/.github/workflows/building-deb-zhuangzhuang.yml@master
secrets: inherit secrets: inherit
call-hetao: call-arch:
uses: GXDE-OS/GXDE/.github/workflows/building-deb-hetao.yml@master uses: GXDE-OS/GXDE/.github/workflows/building-pkg.yml@master
secrets: inherit secrets: inherit
+138
View File
@@ -0,0 +1,138 @@
# Copyright (C) 2026 CharOfString <root@charofstring.cc>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <https://www.gnu.org/licenses/>.
# -----------------------------------------------------------------------------
# 本工作流用于构建Archlinux软件包,仅接受根目录的PKGBUILD或arch/PKGBUILD,没有时跳过。
# This workflow is used to build Arch Linux packages, it only accepts PKGBUILD
# in the root directory of the repo or arch/PKGBUILD, otherwise this will be
# skipped.
name: Building GXDE Arch Package
on:
workflow_call:
secrets:
PASSWD:
required: true
USERS:
required: true
HOST:
required: true
UPATH:
required: true
UPORT:
required: true
UPROGRAM_ARCH:
required: false
env:
REPOSITORY: https://github.com/GXDE-OS/GXDE
BOTTLEPATH: system-bottle
GXDE_ARCH_REPO: https://repo1.gxde.top/gxde-arch
jobs:
detect:
if: github.repository_owner == 'GXDE-OS'
runs-on: ubuntu-24.04
outputs:
pkgbuild-dir: ${{ steps.find.outputs.dir }}
steps:
- uses: actions/checkout@v4
- name: Find PKGBUILD
id: find
run: |
if [[ -f arch/PKGBUILD ]]; then
echo "dir=arch" >> $GITHUB_OUTPUT
elif [[ -f PKGBUILD ]]; then
echo "dir=." >> $GITHUB_OUTPUT
else
echo "No PKGBUILD found, skip Arch build"
fi
build:
needs: detect
if: needs.detect.outputs.pkgbuild-dir != ''
name: ${{ matrix.arch }}-arch
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- arch: x86_64
runner: ubuntu-24.04
- arch: aarch64
runner: ubuntu-24.04-arm
steps:
- name: Clone Repository To Get Script
run: |
git clone $REPOSITORY --depth=1
mv $(basename $REPOSITORY)/* . -v
mv $(basename $REPOSITORY)/.* . -v | true
- name: Configure Base System
run: |
bash .github/workflows/configure-building-enviroment-arch.sh ${{ matrix.arch }} \
$REPOSITORY \
https://github.com/$GITHUB_REPOSITORY \
${{ github.ref_name }} \
$GXDE_ARCH_REPO
- name: Building ${{ GITHUB.repository }}
run: |
gitPath=/home/builder/$(basename $GITHUB_REPOSITORY)/${{ needs.detect.outputs.pkgbuild-dir }}
sudo chroot $BOTTLEPATH sudo -H -u builder bash -c \
"cd $gitPath && makepkg -s --noconfirm --needed"
mkdir -p packages
sudo find $BOTTLEPATH$gitPath -maxdepth 1 -name '*.pkg.tar.*' ! -name '*.sig' -exec cp -v {} packages/ \;
sudo chown -R $(id -u):$(id -g) packages
ls -l packages
- name: Remove Debug Package
run: |
rm -fv packages/*-debug-*.pkg.tar.*
- name: Pack tar
run: |
cd packages
tar -cvf ../arch-${{ matrix.arch }}-$(date +%s).tar *.pkg.tar.*
- name: Push
env:
UPASSWD: ${{ secrets.PASSWD }}
UUSERS: ${{ secrets.USERS }}
UHOST: ${{ secrets.HOST }}
UPATH: ${{ secrets.UPATH }}
UPROGRAM_ARCH: ${{ secrets.UPROGRAM_ARCH }}
UPORT: ${{ secrets.UPORT }}
run: |
if [[ -z "$UPROGRAM_ARCH" ]]; then
echo "::warning::UPROGRAM_ARCH is not set, skip uploading Arch packages"
exit 0
fi
sudo apt update
sudo apt install sshpass -y
mkdir -p ~/.ssh/
ssh-keyscan -p $UPORT -H $UHOST >> ~/.ssh/known_hosts
tarName=$(ls | grep '^arch-.*\.tar$' | head -n 1)
sshpass -p "$UPASSWD" rsync -e "ssh -p $UPORT" $tarName $UUSERS@$UHOST:$UPATH
sshpass -p "$UPASSWD" ssh $UUSERS@$UHOST -p $UPORT $UPROGRAM_ARCH ${{ matrix.arch }} $UPATH/$tarName > /dev/null
- name: Create Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOCKEN_GITHUB }}
with:
files: |
packages/*.pkg.tar.*
@@ -0,0 +1,148 @@
#!/bin/bash
# Copyright (C) 2026 CharOfString <root@charofstring.cc>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <https://www.gnu.org/licenses/>.
# -----------------------------------------------------------------------------
# 本脚本用于构建GXDE Arch打包环境
# 参数$1 = 架构,可选x86_64/aarch64
# 参数$2 = GXDE仓库地址
# 参数$3 = 源码包仓库地址
# 参数$4 = 当前欲构建的分支
# 参数$5 = GXDE Arch源地址,用于获取GXDE依赖
# -----------------------------------------------------------------------------
# This script is used to configure the packaging environment of GXDE on Arch.
# $1 = Archtecture required, either x86_64 or aarch64.
# $2 = GXDE repository address.
# $3 = Repository path of the software to be built.
# $4 = The branch that you want to build.
# $5 = The Arch PACMAN source of GXDE, we'll use it to install dependencies.
set -e
build_arch=$1
bottle_path=./system-bottle
gxde_arch_repo=${5:-https://repo1.gxde.top/gxde-arch}
# 引用/Works Cited: https://patorjk.com/software/taag/#p=display&f=Linguaholic+Shadow+3D
echo ' ██████╗██╗ ██╗██████╗ ████████╗ ████╗ ' &&
echo '██╔═════╝╚═██╗ ██╔═╝██╔═══██╗██╔═════╝ ██╔═══╝ ████╗ ██╗ ████╗ ' &&
echo '██║ ████╗ ╚═██╔═╝ ██║ ██║██████╗ ██████╗ ██╔═══██╗████╔═══╝ ' &&
echo '██║ ╚═██║ ██╔═██╗ ██║ ██║██╔═══╝ ╚═██╔═╝ ██║ ██║██╔═╝ ' &&
echo '╚═██████║██╔═╝ ╚═██╗██████╔═╝████████╗ ██║ ╚═████╔═╝██║ ' &&
echo ' ╚═════╝╚═╝ ╚═╝╚═════╝ ╚═══════╝ ╚═╝ ╚═══╝ ╚═╝ ' &&
echo ' ' &&
echo ' ' &&
echo ' ████╗ ██╗ ██╗ ██╗ ' &&
echo '██╔═══██╗██╗ ████╗ ██████╗██████╗ ██║ ╚═╝██████╗ ██╗ ██╗██╗ ██╗' &&
echo '████████║████╔═══╝██╔═════╝██╔═══██╗██║ ██╗██╔═══██╗██║ ██║╚═████╔═╝' &&
echo '██╔═══██║██╔═╝ ██║ ██║ ██║██║ ██║██║ ██║██║ ██║ ████║ ' &&
echo '██║ ██║██║ ╚═██████╗██║ ██║████████╗██║██║ ██║╚═██████║██╔═══██╗' &&
echo '╚═╝ ╚═╝╚═╝ ╚═════╝╚═╝ ╚═╝╚═══════╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝'
# 先安装解压chroot用的依赖 ・ Install the dependencies for extracting chroot first.
sudo apt update
sudo apt install wget zstd git -y
# 根据架构下载解压对应chroot ・ Download & extract corresponding chroot by archtecture needed.
echo '[I] (Chroot) Init: Starting to download chroot for Archlinux...'
if [[ $build_arch == "x86_64" ]]; then
echo '[I] (Chroot) Init: Archtecture hit >> AMD64.'
wget -q https://geo.mirror.pkgbuild.com/iso/latest/archlinux-bootstrap-x86_64.tar.zst
sudo tar --zstd -xpf archlinux-bootstrap-x86_64.tar.zst --numeric-owner
sudo mv root.x86_64 $bottle_path
echo 'Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' | sudo tee $bottle_path/etc/pacman.d/mirrorlist
keyring=archlinux
elif [[ $build_arch == "aarch64" ]]; then
echo '[I] (Chroot) Init: Archtecture hit >> AARCH64.'
wget -q http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
sudo mkdir -p $bottle_path
sudo tar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C $bottle_path --numeric-owner
keyring=archlinuxarm
else
echo "[E] (Chroot) Init: Unsupportted archtecture $build_arch, HALTED!"
exit 1
fi
echo '[I] (Chroot) Init: Done downloading chroot for Archlinux.'
# 挂载chroot ・ Mount chroot.
echo '[I] (Chroot) Mount: Starting to mount target chroot...'
sudo mount --bind $bottle_path $bottle_path
for i in proc sys dev dev/pts; do
sudo mount --bind /$i $bottle_path/$i
done
# ALARM的resolv.conf是指向/run/systemd/resolve的绝对软链接,需先删除,否则cp会写穿到宿主机且chroot内仍无法解析
# ALARM ships resolv.conf as an absolute symlink into /run/systemd/resolve, remove it first,
# otherwise cp writes through to the host's file and DNS stays broken inside chroot.
sudo rm -f $bottle_path/etc/resolv.conf
sudo cp -L /etc/resolv.conf $bottle_path/etc/resolv.conf
echo '[I] (Chroot) Mount: Done mounting the chroot!'
# Pacman在chroot里无法做沙箱/空间检查
# Pacman is not able to do space check or sandbox in chroot.
echo '[I] (Chroot) PostInit: Disabling sanbox and space check since we are in chroot...'
sudo sed -i 's/^CheckSpace/#CheckSpace/' $bottle_path/etc/pacman.conf
sudo sed -i 's/^#DisableSandbox/DisableSandbox/' $bottle_path/etc/pacman.conf
echo '[I] (Chroot) PostInit: Done disabling unavailable components!'
# 一个小wrapper,在chroot中运行某指令 ・ A wrapper to run certain commands under chroot.
run() {
sudo chroot $bottle_path bash -c "$*"
}
# 写入GXDE Arch源,以便安装dtk等自身提供的依赖
# 新源刚建立时可能还不存在,因此只做可选信任
# --------------------------------------------
# Add GXDE Archlinux PACMAN source to install dependencies such as DTK.
# It may not exist when as we're just getting started, so we will do a Optional TrustAll.
echo '[I] (Chroot) PACMAN: Configuring GXDE pacman source...'
cat << EOF | sudo tee -a $bottle_path/etc/pacman.conf
[gxde]
SigLevel = Optional TrustAll
Server = $gxde_arch_repo/\$arch
EOF
echo '[I] (Chroot) PACMAN: GXDE pacman source has been added to chroot!'
echo '[I] (Chroot) PACMAN: Doing upgrade...'
run pacman-key --init
run pacman-key --populate $keyring
for i in {1..5}; do
# GXDE 源尚不存在时 -Syu 会失败,此时去掉 GXDE 源再试一次
if run pacman -Syu --noconfirm --needed base-devel git sudo; then
break
fi
if [[ $i == 3 ]]; then
echo "GXDE Arch repo unreachable, building without it"
sudo sed -i '/^\[gxde\]/,/^Server/d' $bottle_path/etc/pacman.conf
fi
if [[ $i == 5 ]]; then
echo '[E] (Chroot) PACMAN: Failed to upgrade chroot, HALTED!'
exit 1
fi
sleep 2
done
echo '[I] (Chroot) PACMAN: Shall be okay...'
# makepkg不允许以root运行 ・ makepkg require another account other than root.
echo '[I] (Building) AccountCtl: Setting up builder account...'
run useradd -m builder
echo "builder ALL=(ALL) NOPASSWD: ALL" | sudo tee $bottle_path/etc/sudoers.d/builder
echo '[I] (Building) AccountCtl: Builder account is up!'
# 以builder身份克隆仓库 ・ Clone the repo as builder.
echo '[I] (Building) Builder: Cloning target repository...'
run sudo -H -u builder git clone $3 -b $4 /home/builder/$(basename $3)
echo '[I] (Building) Builder: Done cloning target repository.'
echo '[I] (Env) Setup: Setup finished, bye~'
exit 0
@@ -39,7 +39,7 @@ if [[ $2 == "crimson" ]]; then
useDeepin25 useDeepin25
sudo debootstrap --no-check-gpg --include=git,deepin-keyring,gcc,make,g++,dpkg-dev,qtbase5-dev,ca-certificates --arch=$1 $2 $bottlePath $5 sudo debootstrap --no-check-gpg --include=git,deepin-keyring,gcc,make,g++,dpkg-dev,qtbase5-dev,ca-certificates --arch=$1 $2 $bottlePath $5
else else
sudo debootstrap --no-check-gpg --include=git,gcc,make,debian-ports-archive-keyring,debian-archive-keyring,g++,dpkg-dev,qtbase5-dev,ca-certificates --arch=$1 $2 $bottlePath $5 sudo debootstrap --no-check-gpg --include=git,gcc,make,debian-ports-archive-keyring,debian-archive-keyring,g++,dpkg-dev,qtbase5-dev,ca-certificates,qt6-base-private-dev,qt6-base-dev --arch=$1 $2 $bottlePath $5
fi fi
if [[ $2 == "crimson" ]]; then if [[ $2 == "crimson" ]]; then
+4 -6
View File
@@ -16,17 +16,15 @@ jobs:
- name: Config - name: Config
run: | run: |
sudo apt update sudo apt update
sudo apt install git python3-requests -y sudo apt install git -y
- name: Push - name: Push
env: env:
GITHUBTOKEN: ${{ secrets.GITHUBTOKEN }} GITHUBTOKEN: ${{ secrets.GITHUBTOKEN }}
GITHUBUSER: ${{ secrets.GITHUBUSER }} GITHUBUSER: ${{ secrets.GITHUBUSER }}
GITCODETOKEN: ${{ secrets.GITCODETOKEN }} GITEEUSER: ${{ secrets.GITEEUSER }}
GITCODEUSER: ${{ secrets.GITCODEUSER }} GITEETOCKEN: ${{ secrets.GITEETOCKEN }}
ATOMGITTOKEN: ${{ secrets.ATOMGITTOKEN }}
ATOMGITUSER: ${{ secrets.ATOMGITUSER }}
run: | run: |
cd sync-gitee-to-github cd sync-gitee-to-github
python3 sync.py $GITHUBUSER $GITHUBTOKEN $GITCODEUSER $GITCODETOKEN $ATOMGITUSER $ATOMGITTOKEN python3 sync.py $GITEEUSER $GITEETOCKEN $GITHUBUSER $GITHUBTOKEN
+1 -1
View File
@@ -1,6 +1,6 @@
This file contains honored contributers of GXDE and GXDE OS. The list is in alphabetical order. This file contains honored contributers of GXDE and GXDE OS. The list is in alphabetical order.
CharOfString <markus_verify@126.com> CharOfString <root@charofstring.cc>
dependon <liuminghang0821@gmail.com> dependon <liuminghang0821@gmail.com>
elysia <c.elysia@foxmail.com> elysia <c.elysia@foxmail.com>
gfdgd xi <3025613752@qq.com> gfdgd xi <3025613752@qq.com>
+15 -3
View File
@@ -1,9 +1,18 @@
![HEADER](./readme-header.png)
<div>
<div style="float: left; display: flex; align-items: center" >
<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>
</div>
<div style="float: right">
<a href="./README.zh.md">中文版</a>
</div>
</div>
## Welcome to GXDE OS Community ## Welcome to GXDE OS Community
**[中文](/README.zh.md)**
GXDE OS is an Debian based Linux distro featuring GXDE Desktop Environment. It offers an elegant, beautifu, light weight and out-of-the-box experience. GXDE OS is an Debian based Linux distro featuring GXDE Desktop Environment. It offers an elegant, beautifu, light weight and out-of-the-box experience.
### Classic and Extended Deepin DE Experience ### Classic and Extended Deepin DE Experience
@@ -88,4 +97,7 @@ The author is online and hungry for support (nom nom~). Feeding might even get u
<p><img src="https://www.gxde.top/install/gf.jpg" style="border-radius: 4px;" ></p> <p><img src="https://www.gxde.top/install/gf.jpg" style="border-radius: 4px;" ></p>
# ©2023~Now gfdgd xi
<span style="color: #E6004C; font-size: 20px"><b>©2023~Now gfdgd xi</b></span>
<div style="background: #E6004C; width: 100%; height: 3px;"></div>
+12 -8
View File
@@ -1,11 +1,14 @@
<center><img src=new-logo-long.png width=300/></center> ![HEADER](./readme-header.png)
<hr>
<div>
<div style="float: left; display: flex; align-items: center" >
<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>
![G-Start](https://gitcode.com/GXDE-OS/GXDE/star/badge.svg) </div>
<div style="float: right">
<a href="./README.md">English Version</a>
**[English](/README.md)** </div>
</div>
## 简介 ## 简介
@@ -87,5 +90,6 @@ Gitcode:https://gitcode.com/GXDE-OS
<p><img src="https://www.gxde.top/install/gf.jpg" style="border-radius: 4px;" ></p> <p><img src="https://www.gxde.top/install/gf.jpg" style="border-radius: 4px;" ></p>
<span style="color: #E6004C; font-size: 20px"><b>©2023~Now gfdgd xi</b></span>
# ©2023~Now gfdgd xi <div style="background: #E6004C; width: 100%; height: 3px;"></div>
+33
View File
@@ -0,0 +1,33 @@
# PKGBUILD for testing purpose.
pkgname=gxde-example
pkgver=0
pkgrel=1
pkgdesc="GXDE example component"
arch=('x86_64' 'aarch64')
url="https://github.com/GXDE-OS/${pkgname}"
license=('GPL-3.0-or-later')
depends=('qt5-base')
makedepends=('git' 'cmake' 'qt5-tools')
source=()
sha256sums=()
_srcdir() {
git -C "$startdir" rev-parse --show-toplevel
}
pkgver() {
head -n 1 "$(_srcdir)/debian/changelog" | sed -E 's/.*\(([^)]*)\).*/\1/; s/^[0-9]+://; s/-/./g'
}
build() {
cmake -B build -S "$(_srcdir)" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr
cmake --build build
}
package() {
DESTDIR="$pkgdir" cmake --install build
}
+7 -2
View File
@@ -1,4 +1,4 @@
gxde (2026.07.11) UNRELEASED; urgency=medium gxde (2026.10.26) UNRELEASED; urgency=medium
* 新增 remmina 以解决远程问题 * 新增 remmina 以解决远程问题
* 改为安装 dde-printer * 改为安装 dde-printer
@@ -25,8 +25,13 @@ gxde (2026.07.11) UNRELEASED; urgency=medium
* 更改 gxde-desktop-extra 推荐依赖 * 更改 gxde-desktop-extra 推荐依赖
* 推荐安装 firmware-atheros | firmware-ath9k-htc * 推荐安装 firmware-atheros | firmware-ath9k-htc
* gxde-desktop-android 指定安装 spark-store 而不是可选安装 aptss * gxde-desktop-android 指定安装 spark-store 而不是可选安装 aptss
* 添加推荐依赖 deepin-liferaft
* 新增推荐依赖 gxde-dlna-caster
* 新增推荐依赖 gxde-filetransfer
* 新增推荐依赖 gxde-wayland-session, gxdm-emergency-mode, gxde-freewb, fcitx5-theme-deepin
* 移除星火动态壁纸依赖
-- gfdgd_xi <3025613752@qq.com> Sat, 11 Jul 2026 14:12:50 +0800 -- gfdgd_xi <3025613752@qq.com> Mon, 26 Oct 2026 21:57:06 +0800
gxde (2024.10.20) UNRELEASED; urgency=medium gxde (2024.10.20) UNRELEASED; urgency=medium
+7 -2
View File
@@ -34,8 +34,8 @@ Recommends: ${misc:Depends},
deepin-system-monitor, deepin-system-monitor,
gxde-downloader, gxde-downloader,
gparted, gparted,
fantascene-dynamic-wallpaper,
x11vnc, x11vnc,
gxde-dlna-caster,
com.github.minesweep, com.github.minesweep,
2048-qt, 2048-qt,
papirus-icon-theme | gxde-desktop-android, papirus-icon-theme | gxde-desktop-android,
@@ -48,8 +48,14 @@ Recommends: ${misc:Depends},
deepin-log-viewer, deepin-log-viewer,
fcitx5-table-wubi98, fcitx5-table-wubi98,
fcitx5-pinyin-zhwiki, fcitx5-pinyin-zhwiki,
gxde-freewb,
fcitx5-theme-deepin,
dde-cooperation, dde-cooperation,
firmware-atheros, firmware-atheros,
deepin-liferaft,
gxde-wayland-session,
gxde-filetransfer,
gxdm-emergency-mode,
Description: GXDE New Desktop Environment Extra - Next Description: GXDE New Desktop Environment Extra - Next
This is a meta package depends GXDE New Desktop Envrionment Extra. This is a meta package depends GXDE New Desktop Envrionment Extra.
. .
@@ -166,7 +172,6 @@ Recommends:
plymouth-theme-gxde-logo, plymouth-theme-gxde-logo,
fcitx5, fcitx5,
fcitx5-table, fcitx5-table,
fantascene-dynamic-wallpaper,
x11vnc, x11vnc,
apt-is-aptss, apt-is-aptss,
Conflicts: Conflicts:
+4
View File
@@ -0,0 +1,4 @@
# GXDE Arch Linux pacman source
[gxde]
SigLevel = Optional TrustAll
Server = https://repo1.gxde.top/gxde-arch/$arch
Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

+135 -57
View File
@@ -1,68 +1,146 @@
#!/bin/bash #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
将 Gitee 上的 GXDE-OS 组织仓库镜像同步到 GitHub(GXDE-OS 组织)。
用法:
python3 sync.py <gitee用户名> <gitee密码或Token> <github用户名> <githubToken>
流程:
1. 通过 Gitee API v5 分页获取 GXDE-OS 组织下的全部仓库列表(带 token 失败时回退匿名)
2. 多线程 clone --bare 拉取 Gitee 仓库
3. 逐个 push --mirror 推送到 GitHub,失败自动重试并在结束时汇总报告
"""
import json
import os import os
import subprocess
import sys import sys
import time import time
import requests import urllib.parse
import threading import urllib.request
from concurrent.futures import ThreadPoolExecutor, as_completed
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string programPath = os.path.split(os.path.realpath(__file__))[0]
dataHeaders = { cloneDir = os.path.join(programPath, "git-clone")
"accept": "application/json" orgName = "GXDE-OS"
} perPage = 100
pullUrl = "https://gitee.com/GXDE-OS/" threadMax = 8
pushUrl = [
"https://@USER@:@PASS@@github.com/GXDE-OS/",
"https://@USER@:@PASS@@gitcode.com/GXDE-OS/",
"https://@USER@:@PASS@@atomgit.com/GXDE-OS/"
]
if (len(sys.argv) < 1 + len(pushUrl) * 2):
print(f"请输入用于推送的账户和密码(需要 {len(pushUrl)} 组以推送不同的平台,提供顺序如下)")
for i in pushUrl:
print(f" {i}")
exit(1)
# 读取参数 def usage():
userName = [] print("用法: python3 sync.py <gitee用户名> <gitee密码或Token> <github用户名> <githubToken>")
password = [] sys.exit(1)
for i in range(1, len(sys.argv)):
# 输入账户
if (i % 2 == 1):
userName.append(sys.argv[i])
# 输入密码
if (i % 2 == 0):
password.append(sys.argv[i])
def sync(i):
global thread
# 拉取代码进行同步
if (not os.path.exists(f"{programPath}/git-clone")):
os.makedirs(f"{programPath}/git-clone")
print(f"======================> {pullUrl}/{i}")
os.system(f"cd '{programPath}/git-clone' ; git clone --bare '{pullUrl}/{i}'")
# 推送
for j in range(len(pushUrl)):
# git remote set-url origin
gitUrl = pushUrl[j].replace("@USER@", userName[j]).replace("@PASS@", password[j]) + "/" + i
os.system(f"cd '{programPath}/git-clone/{i}.git' ; git remote set-url origin '{gitUrl}'")
os.system(f"cd '{programPath}/git-clone/{i}.git' ; git push --mirror")
# 移除临时文件
os.system(f"rm -rf '{programPath}/git-clone/{i}.git'")
thread -= 1
data = requests.get("https://api.github.com/users/GXDE-OS/repos", headers=dataHeaders).json() def apiGet(path, params):
repoList = [] """调用 Gitee API v5 的单个请求"""
# 获取仓库列表 params["per_page"] = str(perPage)
for i in data: url = "https://gitee.com/api/v5" + path + "?" + urllib.parse.urlencode(params)
repoList.append(i["name"]) req = urllib.request.Request(url, headers={"User-Agent": "GXDE-Sync/1.0"})
# 多线程处理以提升速度 with urllib.request.urlopen(req, timeout=30) as resp:
thread = 0 return json.loads(resp.read().decode("utf-8"))
threadMax = 32
for i in repoList:
def getGiteeRepos(token):
"""分页获取 Gitee 组织下全部仓库的 path(URL 安全路径)
Gitee API 返回的 name 是仓库别名(可能含大写、中文或括号,如
"CTranslate2"),不能直接用作 clone URL 的路径组件;path 才是 URL
安全的仓库路径(如 "ctranslate2"),用它拼接 clone/push URL 才合法。
"""
repoList = []
page = 1
while True: while True:
time.sleep(0.1) params = {"page": str(page)}
if (thread < threadMax): if token:
threading.Thread(target=sync, args=[i]).start() params["access_token"] = token
thread += 1 data = apiGet(f"/orgs/{orgName}/repos", params)
if not isinstance(data, list) or len(data) == 0:
break break
repoList.extend([i["path"] for i in data])
page += 1
return repoList
def runGit(args, cwd=None):
return subprocess.run(args, cwd=cwd, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, text=True)
def syncRepo(name, pullUrl, pushUrl):
repoDir = os.path.join(cloneDir, name + ".git")
try:
# 1. 从 Gitee clone --bare(重试 3 次)
ok = False
lastOut = ""
for attempt in range(3):
result = runGit(["git", "clone", "--bare", pullUrl + name, repoDir])
if result.returncode == 0:
ok = True
break
lastOut = result.stdout
time.sleep(5)
if not ok:
print(f"[FAIL] clone 失败: {name}\n{lastOut}")
return False
# 2. push --mirror 到 GitHub(重试 3 次)
ok = False
lastOut = ""
for attempt in range(3):
result = runGit(["git", "-C", repoDir, "push", "--mirror", pushUrl + name])
if result.returncode == 0:
ok = True
break
lastOut = result.stdout
time.sleep(5)
if not ok:
print(f"[FAIL] push 失败: {name}\n{lastOut}")
return False
print(f"[ OK ] 同步完成: {name}")
return True
finally:
# 清理临时目录
runGit(["rm", "-rf", repoDir])
def main():
if len(sys.argv) < 5:
usage()
giteeUser, giteeToken = sys.argv[1], sys.argv[2]
githubUser, githubToken = sys.argv[3], sys.argv[4]
pullUrl = f"https://{urllib.parse.quote(giteeUser)}:{urllib.parse.quote(giteeToken)}@gitee.com/{orgName}/"
pushUrl = f"https://{urllib.parse.quote(githubUser)}:{urllib.parse.quote(githubToken)}@github.com/{orgName}/"
os.makedirs(cloneDir, exist_ok=True)
# 获取仓库列表:优先带 token,失败则回退到匿名(仅公开仓库)
try:
repoList = getGiteeRepos(giteeToken)
except Exception:
repoList = getGiteeRepos("")
print(f"共获取到 {len(repoList)} 个仓库")
if not repoList:
print("未能获取仓库列表,退出")
sys.exit(1)
failed = []
with ThreadPoolExecutor(max_workers=threadMax) as pool:
futures = {pool.submit(syncRepo, n, pullUrl, pushUrl): n for n in repoList}
for future in as_completed(futures):
if not future.result():
failed.append(futures[future])
print("=" * 50)
print(f"同步完成: 成功 {len(repoList) - len(failed)} / {len(repoList)}")
if failed:
print("以下仓库同步失败:")
for name in failed:
print(" -", name)
sys.exit(1)
if __name__ == "__main__":
main()
+112
View File
@@ -0,0 +1,112 @@
#!/bin/bash
# Copyright (C) 2026 CharOfString <root@charofstring.cc>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program. If not, see <https://www.gnu.org/licenses/>.
# -----------------------------------------------------------------------------
# 本脚本用于向GXDE Arch源上传包并更新数据库,由building-pkg.yml自动调用
# 用法:
# arch-repo-update.sh <x86_64|aarch64> <arch-xxx.tar>
# 依赖:
# repo-add、bsdtar、flock (Archlinux自带;Debian上需要安装pacman-package-manager、libarchive-tools)
# 环境变量:
# GXDE_ARCH_REPO_ROOT 源根目录,对外地址为 https://repo1.gxde.top/gxde-arch/$arch
# GXDE_ARCH_GPG_KEY 可选,设置后对包和数据库进行签名
# -----------------------------------------------------------------------------
# This script updates the artifacts in GXDE pacman source and is invoked by
# building-pkg.yml automatically.
# Usage:
# arch-repo-update.sh <x86_64|aarch64> <arch-xxx.tar>
# Dependencies:
# repo-add, bsdtar, flock (Archlinux built-in; on Debian, install pacman-package-manager
# and libarchive-tools)
# Environment variables:
# GXDE_ARCH_REPO_ROOT The root directory of the source, externally accessible at
# https://repo1.gxde.top/gxde-arch/$arch
# GXDE_ARCH_GPG_KEY Optional, if set, will sign the packages and database.
set -e
arch=$1
tar_path=$2
repo_root=${GXDE_ARCH_REPO_ROOT:-/var/www/repo/gxde-arch}
repo_name=gxde
# 引用/Works Cited: https://patorjk.com/software/taag/#p=display&f=Linguaholic+Shadow+3D
echo ' ██████╗██╗ ██╗██████╗ ████████╗ ████╗ ' &&
echo '██╔═════╝╚═██╗ ██╔═╝██╔═══██╗██╔═════╝ ██╔═══╝ ████╗ ██╗ ████╗ ' &&
echo '██║ ████╗ ╚═██╔═╝ ██║ ██║██████╗ ██████╗ ██╔═══██╗████╔═══╝ ' &&
echo '██║ ╚═██║ ██╔═██╗ ██║ ██║██╔═══╝ ╚═██╔═╝ ██║ ██║██╔═╝ ' &&
echo '╚═██████║██╔═╝ ╚═██╗██████╔═╝████████╗ ██║ ╚═████╔═╝██║ ' &&
echo ' ╚═════╝╚═╝ ╚═╝╚═════╝ ╚═══════╝ ╚═╝ ╚═══╝ ╚═╝ ' &&
echo ' ' &&
echo ' ' &&
echo ' ████╗ ██╗ ██╗ ██╗ ' &&
echo '██╔═══██╗██╗ ████╗ ██████╗██████╗ ██║ ╚═╝██████╗ ██╗ ██╗██╗ ██╗' &&
echo '████████║████╔═══╝██╔═════╝██╔═══██╗██║ ██╗██╔═══██╗██║ ██║╚═████╔═╝' &&
echo '██╔═══██║██╔═╝ ██║ ██║ ██║██║ ██║██║ ██║██║ ██║ ████║ ' &&
echo '██║ ██║██║ ╚═██████╗██║ ██║████████╗██║██║ ██║╚═██████║██╔═══██╗' &&
echo '╚═╝ ╚═╝╚═╝ ╚═════╝╚═╝ ╚═╝╚═══════╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝'
# repo-add依赖bsdtar读取包,缺失时只会报"is not a package file"
# repo-add needs bsdtar to read packages, without it it only says "is not a package file".
for cmd in repo-add bsdtar flock; do
if ! command -v $cmd > /dev/null; then
echo "$cmd not found, install pacman-package-manager and libarchive-tools" >&2
exit 1
fi
done
case $arch in
x86_64|aarch64) ;;
*) echo "Unsupported arch: $arch" >&2; exit 1 ;;
esac
if [[ ! -f $tar_path ]]; then
echo "$tar_path not found" >&2
exit 1
fi
repoDir=$repo_root/$arch
mkdir -p $repoDir
exec 9> $repoDir/.lock
flock 9
tmpDir=$(mktemp -d)
trap "rm -rf $tmpDir" EXIT
tar -xf $tar_path -C $tmpDir
newPackages=()
for pkg in $tmpDir/*.pkg.tar.*; do
[[ $pkg == *.sig ]] && continue
name=$(basename $pkg)
mv -f $pkg $repoDir/$name
if [[ -n $GXDE_ARCH_GPG_KEY ]]; then
rm -f $repoDir/$name.sig
gpg --batch --yes -u $GXDE_ARCH_GPG_KEY --detach-sign --no-armor $repoDir/$name
fi
newPackages+=($repoDir/$name)
done
if [[ ${#newPackages[@]} == 0 ]]; then
echo "No package in $tar_path" >&2
exit 1
fi
signArgs=()
if [[ -n $GXDE_ARCH_GPG_KEY ]]; then
signArgs=(--sign --key $GXDE_ARCH_GPG_KEY)
fi
repo-add -R "${signArgs[@]}" $repoDir/$repo_name.db.tar.gz "${newPackages[@]}"
rm -f $tar_path