这是我参与更文应战的第12天,活动概况检查:更文应战

任何东西都有丢掉的或许性,除非你在丢掉前做好了备份!本文将说明怎么运用 GitHub Actions 完结主动备份代码仓。

方针

本文的方针是将 GitHub 用户 user-a 下的悉数代码仓同步到 GitHub 用户 user-ubuntu是什么操作体系b 下。

预备

新建一个代码仓,代码仓的目录结构下面这样:

.
├── .github
│   └── workflows
│       └── mirror.yaml

并在代码仓中设置三个 Secret,别离是:

  • GH闰土刺猹_TOKubuntu装置教程EN_A 对应 GitHub 用户 user-a 的 AccessToken
  • GH_TOKEN_B 对应 GitHub 用户 user-b 的 AccessToken
  • SLACK_WEBHOOK 对应 Slack WebHoogit指令k 地址(可选)

作业流

获取代码仓列表

运用 GitHub CLI gh 获取 GitHub 用户 user-a 下的悉数代码仓

echo ${GH_TOKEN_A} > gh_tubuntu体系菜鸟入门oken_a #http://192.168.1.1登录 将 user-a 的 GitHub AccessToken 写入文件
gh auth login --with-token < gh_token_a # GitHugithub中文官网网页b CLI 登录
gh repo list user-a -L 1000 > a_repos # 获取 user-a 的悉数代码仓并写入文件
cat a_repo闰土刺猹图片shttps协议 # 闪现代码仓列表
cat a_repos | wc -l # 闪现代码仓总数

创建同名代码仓

在 GitHub 用户 user-b 下创建同名代码仓。

gh repo create user-b/${repo_name} --private --description "${repo}" -y || true # 疏忽过错,代码仓或许已经存在

克隆https和http的差异代码仓

运用 --bare 参数克隆 GitHub 用户 user-a 下的http://www.baidu.com代码仓。

git clone --bare https://${GH_TOKEN_A}@github.com/user-a/${repo_name}.gitgitlab ${repo_name}

推送代码

运用 --all--mirror 参数别离进行代码推送,防止推送的数据过大导致推送失败。

  • --all 标明推送悉数的分支
  • --mirror 标明推送 refs/ 下的悉数引证,包括分支、标签等
cd ${repo_name}
mhttps和http的差异irror_repo="https://${GH_TOKENgithub永久回家地址_B}@gigithubthuubuntu20.04装置教程b.com/user-b/${repo_name}.git"
git push --all -f ${mirror_repo} || true
git push --mirror -f ${mirror_repo} || true

优化

  • 疏忽体积过大或许不http 404需求备份的代码仓
# 为了确保代码仓称谓判别的准确性,在界说和判别时,在每个代码github是干什么的仓称谓的左右添加斜杆
IGNORE_REPOS="/rhttps协议epo_闰土刺猹图片a/repo_b/"
[[ ${IGNORE人体接受的最大电压_REPOS} =~ "/${regiteepo_name}/" ]乳糖操纵子] && continue || true
  • 关于 tag 数量太多的代码仓,仅备份分支
ONLY_BRANCH_REP闰土刺猹OS="/repo_c/repo_d/"
[[ ${ONLYrtc是什么意思_BRANCH_Rgithub中文官网网页EPOS} =~ "/${repo_name}/" ]] && continue || true
  • 由于 GitHub Actions 的时区为 UTC,守时使命的时间需求 -8h

周一到周五的清晨2点:

  • 一般配备:0 2 * * 1-5
  • GitHugitlabb Actions 守时使命:github是干什么的0 18 * * 0-4

无缺的作业流配人体接受的最大电压

.github/w人体接受的最大电压orkflows/mirror.yaml 文件的内容:

name:ubuntu体系菜鸟入门 Mirror repos
on:
schttp://192.168.1.1登录hedule:
- cron: "0 18 * * 0-4" # 设置守时使命,周一到周五的清晨2点进行备份
workflow_dispatch: # 手动触发构建
jobs:
mirror:
runs-on: ubuntu-latest
steps:
- uses: aGitctions/checkout@v2
- name: GitHub CLI version
run: gh --version
- name: List rephttps协议os
enRTCv:
GH_TOKEN_A: ${{ secrgit指令ets.GH_TOKEN_A }}
run: |
echo $rtc是什么意思{GH_TOKEN_A} > gh_token_a
gh auth login --with-token <http署理 gh_token_a
gh repo list user-a -L 1000 > a_reposHTTPS
cat a_repubuntu体系装置os
cat a_repos | wc -l

- name: Mirror repos
env:
GH_TOKEN_A: ${{ secrhttps和http的差异ets.GH_TOKEN_A }}人头攒动
GH_T闰土刺猹OKEN_B: ${{ secrets.GH_乳糖操纵子TOKEN_B }}
IGNORE_REPOSubuntu体系菜鸟入门: "/repo_a/repo_b/"
ONLY_BRANCH_REPOS: "/repo_c/repo_d/"
run: |
echo ${GH_T人头攒动的近义词OKEN_B} > gh_token_b
gh agit指令uth login --ubuntu指令with-token < gh_token_b

mkdir repos
cd repos
set -x
cat ${GITHUB_WORKSPACE}/a_repos | while read repo; dubuntu装置教程o
repo_name=$(ubuntu体系echo ${http协议repo} | awk '{print $1}' | awk -F/ '{print $2}')
[[ ${IGNORE_REPOS} =~ "/${repo_name}/" ]] &&aubuntu体系mp; contgithub是干什么的inue || true
gh repo create user-b/${repo_name} --privgithub是干什么的ate --description "${repo}" -y || true
rm -rf ${repo_name}
git clone --bare https://${GH_TOKEN_ubuntu是什么操作体系A}让天秤倒追的星座@github.com/user-a/${repo_name}.git ${repo_name}
cd ${repo_HTTPSname}
mirror_repo="hthttpclienttps://${GH_TOKENubuntu是什么操作体系_B}@github.com/user-b/${repo_name}.git"
git push --all -f ${mirror_repoHTTP} || true
[[ ${ONLY_http协议BRANCH_REPOS} =~ "/${repo_name}/" ]] && continue || true
git push --mirror -f ${mirror_repo} || true
cd -
done
- name: Slack Notification
uses: rtCamp/action-slack-notify@v2
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}