这是我参与更文应战的第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 }}