juechafun/auto_backup.py

98 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import subprocess
import os
from datetime import datetime # 新增:导入时间模块
def git_operations(repo_path, commit_message=None):
"""
执行 Git 的 add、commit、pull、push 操作
Args:
repo_path (str): Git 仓库的本地路径
commit_message (str): commit 提交信息,不传则使用带时间的默认备份信息
Returns:
bool: 所有操作是否成功完成
"""
# 处理默认提交信息(自动生成带当前时间的备份信息)
if commit_message is None:
# 获取当前时间并格式化为「年-月-日 时:分:秒」(也可根据需求调整格式)
current_time = datetime.now().strftime("%Y年%m月%d%H时%M分%S秒")
commit_message = f"build(备份): {current_time}自动备份"
# 切换到仓库目录
original_cwd = os.getcwd()
try:
os.chdir(repo_path)
print(f"✅ 已切换到仓库目录: {repo_path}")
# 1. 执行 git add . (添加所有变更文件)
print("\n📤 执行 git add . ...")
add_result = subprocess.run(
["git", "add", "."],
capture_output=True,
text=True,
encoding="utf-8" # 解决中文乱码问题
)
if add_result.returncode != 0:
raise Exception(f"git add 失败: {add_result.stderr}")
print("✅ git add 执行成功")
# 2. 执行 git commit
print("\n📝 执行 git commit ...")
commit_result = subprocess.run(
["git", "commit", "-m", commit_message],
capture_output=True,
text=True,
encoding="utf-8"
)
if commit_result.returncode != 0:
# 处理没有变更需要提交的情况(这是正常情况,不是错误)
if "nothing to commit" in commit_result.stderr or "nothing to commit" in commit_result.stdout:
print(" 没有变更需要提交,跳过 commit")
else:
raise Exception(f"git commit 失败: {commit_result.stderr}")
else:
print(f"✅ git commit 执行成功: {commit_message}")
# 3. 执行 git pull (拉取远程最新代码,避免冲突)
print("\n⬇️ 执行 git pull ...")
pull_result = subprocess.run(
["git", "pull"],
capture_output=True,
text=True,
encoding="utf-8"
)
if pull_result.returncode != 0:
raise Exception(f"git pull 失败: {pull_result.stderr}")
print("✅ git pull 执行成功")
# 4. 执行 git push (推送到远程仓库)
print("\n⬆️ 执行 git push ...")
push_result = subprocess.run(
["git", "push"],
capture_output=True,
text=True,
encoding="utf-8"
)
if push_result.returncode != 0:
raise Exception(f"git push 失败: {push_result.stderr}")
print("✅ git push 执行成功")
print("\n🎉 所有 Git 操作执行完成!")
return True
except Exception as e:
print(f"\n❌ 操作失败: {str(e)}")
return False
finally:
# 切回原来的工作目录
os.chdir(original_cwd)
# ------------------- 使用示例 -------------------
if __name__ == "__main__":
# 替换为你的 Git 仓库本地路径
REPO_PATH = "d:\BaiduSyncdisk\Obsidian\juechafun"
# 无需手动传 commit 信息,会自动生成带当前时间的备份信息
# 执行 Git 操作
git_operations(repo_path=REPO_PATH)