139 lines
4.5 KiB
Python
139 lines
4.5 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
Git 自动上传脚本(跨平台)
|
||
支持 Windows、Linux、Mac
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import subprocess
|
||
import platform
|
||
from datetime import datetime
|
||
|
||
# 颜色输出(Windows 10+ 支持 ANSI)
|
||
def print_color(text, color="white"):
|
||
colors = {
|
||
"red": "\033[0;31m",
|
||
"green": "\033[0;32m",
|
||
"yellow": "\033[1;33m",
|
||
"blue": "\033[0;34m",
|
||
"reset": "\033[0m"
|
||
}
|
||
if platform.system() == "Windows":
|
||
# Windows 10+ 支持 ANSI,需要启用
|
||
try:
|
||
import ctypes
|
||
kernel32 = ctypes.windll.kernel32
|
||
kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)
|
||
except:
|
||
pass
|
||
|
||
color_code = colors.get(color.lower(), colors["reset"])
|
||
reset = colors["reset"]
|
||
print(f"{color_code}{text}{reset}")
|
||
|
||
def run_command(cmd, check=True):
|
||
"""执行命令并返回结果"""
|
||
try:
|
||
result = subprocess.run(
|
||
cmd,
|
||
shell=True,
|
||
check=check,
|
||
capture_output=True,
|
||
text=True,
|
||
encoding='utf-8'
|
||
)
|
||
return result.returncode == 0, result.stdout.strip(), result.stderr.strip()
|
||
except subprocess.CalledProcessError as e:
|
||
return False, e.stdout.strip() if hasattr(e, 'stdout') else "", e.stderr.strip() if hasattr(e, 'stderr') else ""
|
||
|
||
def main():
|
||
print_color("=== Git 自动上传脚本 ===", "green")
|
||
|
||
# 检查是否在 git 仓库中
|
||
if not os.path.exists(".git"):
|
||
print_color("错误: 当前目录不是 git 仓库", "red")
|
||
sys.exit(1)
|
||
|
||
# 获取当前分支
|
||
success, branch, _ = run_command("git branch --show-current", check=False)
|
||
if not success:
|
||
success, branch, _ = run_command("git rev-parse --abbrev-ref HEAD", check=False)
|
||
|
||
if not branch:
|
||
print_color("错误: 无法获取当前分支", "red")
|
||
sys.exit(1)
|
||
|
||
print_color(f"当前分支: {branch}", "yellow")
|
||
|
||
# 检查是否有未提交的更改
|
||
success, status, _ = run_command("git status --porcelain", check=False)
|
||
if not status:
|
||
print_color("没有需要提交的更改", "yellow")
|
||
response = input("是否继续检查远程更新? (y/n) ").strip().lower()
|
||
if response == 'y':
|
||
print_color("拉取远程更新...", "green")
|
||
run_command(f"git pull origin {branch}", check=False)
|
||
sys.exit(0)
|
||
|
||
# 显示当前状态
|
||
print_color("当前更改状态:", "yellow")
|
||
success, status_output, _ = run_command("git status --short", check=False)
|
||
print(status_output)
|
||
|
||
# 询问是否继续
|
||
response = input("是否继续提交并推送? (y/n) ").strip().lower()
|
||
if response != 'y':
|
||
print_color("操作已取消", "yellow")
|
||
sys.exit(0)
|
||
|
||
# 获取提交信息
|
||
if len(sys.argv) > 1:
|
||
commit_msg = " ".join(sys.argv[1:])
|
||
else:
|
||
default_msg = f"chore: update code {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
||
user_msg = input(f"请输入提交信息(或直接按回车使用默认信息): ").strip()
|
||
commit_msg = user_msg if user_msg else default_msg
|
||
|
||
# 添加所有更改
|
||
print_color("添加文件到暂存区...", "green")
|
||
success, _, error = run_command("git add -A")
|
||
if not success:
|
||
print_color(f"添加文件失败: {error}", "red")
|
||
sys.exit(1)
|
||
|
||
# 提交更改
|
||
print_color("提交更改...", "green")
|
||
success, _, error = run_command(f'git commit -m "{commit_msg}"')
|
||
if not success:
|
||
if "nothing to commit" in error.lower():
|
||
print_color("没有需要提交的更改", "yellow")
|
||
sys.exit(0)
|
||
print_color(f"提交失败: {error}", "red")
|
||
sys.exit(1)
|
||
print_color("提交成功!", "green")
|
||
|
||
# 推送到远程
|
||
print_color("推送到远程仓库...", "green")
|
||
success, _, error = run_command(f"git push origin {branch}")
|
||
if not success:
|
||
print_color(f"推送失败: {error}", "red")
|
||
print_color(f"提示: 可以手动执行 'git push origin {branch}'", "yellow")
|
||
print_color("可能需要设置远程仓库地址或进行身份验证", "yellow")
|
||
sys.exit(1)
|
||
|
||
print_color("✓ 推送成功!", "green")
|
||
print_color("=== 完成 ===", "green")
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
main()
|
||
except KeyboardInterrupt:
|
||
print_color("\n操作已取消", "yellow")
|
||
sys.exit(0)
|
||
except Exception as e:
|
||
print_color(f"发生错误: {e}", "red")
|
||
sys.exit(1)
|
||
|