灵感来源:某天在 GitHub 上看到一个用户的热门图,发现他每天都有提交记载,十分帅!
所以先搜搜有没有主动提交的工具,但是找到的成果有些需要在本地运转;有些则没有检查当天是否有提交记载,假如有提交当然不希望有一个虚拟的提交。
所以就有了这个项目,运用 GitHub Actions 主动提交代码,保持 GitHub 热门图常绿。
项目地址:github-auto-commit,假如对你有帮助,能够点个 star 支持一下~
功用特点
- 主动提交与推送: 假如一切代码库房今日没有任何提交,工作流程将主动提交一个虚拟的提交,并将其推送到代码库房。
- 支持装备: 能够依据自己的需求进行装备,包含调整守时使命时刻、更改 Git 设置信息以及自定义提交信息等。
运用方法
- Fork 本库房: 首先,将本库房 Fork 到你自己的 GitHub 账号下。
-
生成个人拜访令牌(PAT): 在 GitHub 设置中生成一个具有
repo
权限规模的个人拜访令牌。 -
设置库房 Secrets: 在库房的设置中,添加一个名为
TOKEN
的 Secrets,将在过程 2 中生成的 PAT 值作为其值。
装备
能够依据自己的需求对工作流程进行以下装备:
-
调整守时使命时刻: 能够在工作流程文件中修正
schedule
部分的 cron 表达式,以更改工作流程的触发时刻。 -
更改 Git 设置信息: 在工作流程文件中的
Set up Git
过程中,更改 Git 的用户邮箱和用户名。 -
自定义提交信息: 在工作流程文件的最后一步中,依据需要修正
date_today
、time_start
、time_end
、repo
和commit_message
等变量,以调整主动提交的内容和提交信息。
完成
整体工作原理是运用 GitHub Actions 完成守时触发使命。
运用 GitHub 供给的 API 来获取用户一切的代码库房,并获取取每个库房的提交信息。
假如在一切库房中都没有找到今日的提交记载,工作流程会主动创建一个虚拟的提交并推送到代码库房中。
完整代码如下:
name: Auto Commit
on:
schedule:
- cron: '50 15 * * *' # run at 23:50 in China time
workflow_dispatch:
jobs:
check_commits:
runs-on: ubuntu-latest
steps:
- name: Checkout this repository
uses: actions/checkout@v2
- name: Set up Git
run: |
# You should set your email and name here.
git config --global user.email "wzw15292257101@163.com"
git config --global user.name "dribble-njr"
- name: Get all repositories
id: get-repos
run: |
echo "Fetching all repositories..."
response=$(curl -s -w "n%{http_code}" -H "Authorization: token ${{ secrets.TOKEN }}" "https://api.github.com/user/repos?type=all")
http_code=$(echo "$response" | tail -n1)
response_body=$(echo "$response" | sed '$d')
echo "[HTTP status code]: $http_code"
contained_repos=$(echo "$response_body" | jq -r '.[] | .full_name')
echo "Contained repositories: $contained_repos"
echo "::set-output name=repos::$(echo "$contained_repos" | tr 'n' ',')" # output repos
- name: Read repositories list and check commits
run: |
# Set custom timezone and other config by yourself.
date_today=$(TZ='Asia/Shanghai' date -I) # Date part
time_start="${date_today}T00:00:00"
time_end="${date_today}T23:55:00"
repo="https://github.com/dribble-njr/github-auto-commit.git"
commit_message="Auto commit on $(TZ='Asia/Shanghai' date ' %Y-%m-%d %H:%M:%S')"
commits_exist=false
echo "Checking commits between $time_start and $time_end"
IFS=', ' read -r -a repos <<< "${{ steps.get-repos.outputs.repos }}"
for repo in "${repos[@]}"; do
echo "Checking commits for $repo"
commit_today=$(curl -H "Authorization: token ${{ secrets.TOKEN }}" -s "https://api.github.com/repos/$repo/commits?since=$time_start&until=$time_end")
if echo "$commit_today" | jq -e '.[]' > /dev/null; then
echo "Commits today in $repo:"
echo "$commit_today"
commits_exist=true
break
fi
done
if [[ "$commits_exist" == "false" ]]; then
echo "No commits found today across all repositories. Creating a dummy commit..."
git clone $repo
cd github-auto-commit
echo "$date_today No commits found today, auto commited." >> dummy.txt
git add dummy.txt
git commit -m "$commit_message"
git push https://${{ secrets.TOKEN }}@github.com/${{ github.repository }}.git
else
echo "Commits found today."
fi