检测git变化并提交

比如:

新建一个名为 autocommit.sh 的脚本,内容为:

#!/bin/bash

cd /path/project

# 检查是否有待暂存的更改
CHANGES=$(git status --porcelain)

if [ -n "$CHANGES" ]; then
    echo "Changes detected. Committing..."
    # 添加所有变更到暂存区
    git add .
    # 提交所有暂存的变更,这里你可以自定义提交信息
    git commit -m "Automatic commit at $(date)"
fi

-n 是一个测试操作符,用于测试字符串是否不为空。

具体来说:

  • -n STRING:如果STRING的长度非零(即字符串不为空),则返回真(true),退出状态码为0。
  • "$VARIABLE":双引号包围变量$VARIABLE是为了防止空格或特殊字符导致的错误解析。

然后定时执行就可以了,比如:

while true; do 
  bash /path/autocommit.sh
  sleep 60;
done

或者直接把 autocommit.sh 放到定时任务执行,比如:

* * * * * /bin/bash /path/autocommit.sh >/dev/null 2>&1 &

这里每分钟执行一次。

当然,这里前提还要先拉取下,并检测是否有冲突等,再决定是否提交。

检测 git 文件是否发生了冲突可参考 检测git中是否有文件发生了冲突

实例:

#!/usr/bin/env bash

# * * * * * /bin/bash /path/bin/mynotes_autocommit.sh >/dev/null 2>&1 &
# nohup bash /path/bin/mynotes_autocommit.sh >/dev/null 2>&1 &

# 监控的根目录和批处理文件
src_dir="/path/Documents/我的笔记"
git="/usr/bin/git"

cd "$src_dir";

# 检查是否有待暂存的更改
CHANGES=$($git status --porcelain)

if [ -n "$CHANGES" ]; then
    # $git pull origin main

    #if [ -n "$($git diff --name-only --diff-filter=U)" ]; then
    #  osascript -e "display notification \"自动提交时发现有冲突文件,请手动处理!\" with title \"提示:\""
    #  exit 1
    #fi

    # 添加所有变更到暂存区
    $git add .
    # 提交所有暂存的变更,这里你可以自定义提交信息
    $git commit -m "Automatic commit at $(date)"

    #$git push origin main
fi

为什么这里 git 路径要赋值给变量 git="/usr/bin/git",参考 为什么在终端可以直接输入gsed,而在crontab脚本里必须输入全路径?