import subprocess
import sys
from datetime import datetime
def run_command(command):
"""
执行系统命令并返回结果
:param command: 命令字符串或列表
:return: (成功标志, 输出信息)
"""
try:
# 如果传入字符串,则分割成列表
if isinstance(command, str):
command = command.split()
# 执行命令
result = subprocess.run(command, capture_output=True, text=True, check=True)
return True, result.stdout.strip()
except subprocess.CalledProcessError as e:
return False, f"命令执行失败: {e.stderr.strip()}"
except Exception as e:
return False, f"未知错误: {str(e)}"
def git_auto_commit(commit_message=None):
"""
自动化Git提交
:param commit_message: 提交信息,若为空则使用默认信息
"""
print("???? 开始自动化Git提交流程...\n")
# 1. 检查是否在Git仓库中
success, output = run_command("git status")
if not success:
print("? 错误: 当前目录不是Git仓库或Git未安装。")
print(output)
return
print("? 检测到Git仓库,状态检查通过。")
# 2. 获取当前分支信息
success, branch = run_command("git branch --show-current")
if success:
print(f"???? 当前分支: {branch}")
else:
print("?? 无法获取分支信息。")
# 3. 添加所有变更文件
print("\n???? 正在添加所有变更文件到暂存区...")
success, output = run_command("git add .")
if not success:
print(f"? 文件添加失败: {output}")
return
print("? 所有文件已添加。")
# 4. 构造提交信息
if not commit_message:
commit_message = f"Auto-commit from Python script on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
# 5. 执行提交
print(f"\n???? 正在提交变更: {commit_message}")
success, output = run_command(["git", "commit", "-m", commit_message])
if not success:
# 如果没有变更需要提交,git commit 会失败,但这是正常情况
if "nothing to commit" in output:
print("? 仓库已是最新,无需提交。")
# 仍然继续推送,以防有新的标签或其他更新
else:
print(f"? 提交失败: {output}")
return
else:
print("? 提交成功!")
# 6. 推送到远程仓库
print("\n???? 正在推送到远程仓库...")
success, output = run_command("git push")
if not success:
print(f"? 推送失败: {output}")
print("???? 请检查网络连接、远程仓库地址和认证信息(如SSH密钥或Token)。")
return
print("? 推送成功!")
print(f"\n???? 自动化提交流程已完成!")
# 7. 显示最终状态
print("\n???? 最终仓库状态:")
success, status = run_command("git status --short")
if success:
if status:
print("?? 以下文件未跟踪或有未提交的更改:")
print(status)
else:
print("? 仓库状态干净,所有更改已提交并推送。")
else:
print("无法获取最终状态。")
if __name__ == "__main__":
# 可以从命令行参数获取提交信息
message = None
if len(sys.argv) > 1:
message = " ".join(sys.argv[1:])
git_auto_commit(message)
|