Files
Neo-ZQYY/scripts/ops/sync_branches.py

89 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
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.
"""
将 dev 分支同步到 test 和 master。
使用 git reset --hard 强制对齐,绕过文件锁问题。
"""
import subprocess
import sys
import time
def run(cmd: str, retries: int = 3, delay: float = 2.0) -> bool:
"""执行 git 命令,失败时重试。"""
for attempt in range(1, retries + 1):
print(f" [{attempt}/{retries}] {cmd}")
result = subprocess.run(
cmd, shell=True, capture_output=True, text=True,
cwd=r"C:\NeoZQYY", encoding="utf-8", errors="replace",
)
if result.returncode == 0:
if result.stdout.strip():
print(f" {result.stdout.strip()}")
return True
print(f" 失败: {result.stderr.strip()[:300]}")
if attempt < retries:
print(f" 等待 {delay}s 后重试…")
time.sleep(delay)
return False
def sync_branch(target: str, source_hash: str) -> bool:
"""将 target 分支强制对齐到 source_hash。"""
print(f"\n{'='*50}")
print(f"同步 {target}{source_hash[:8]}")
print(f"{'='*50}")
if not run(f"git checkout --force {target}"):
print(f" ✗ 切换到 {target} 失败")
return False
# 用 reset --hard 强制对齐,不受文件锁影响
if not run(f"git reset --hard {source_hash}"):
print(f" ✗ reset --hard 失败")
return False
print(f"{target} 已对齐到 {source_hash[:8]}")
return True
def main():
# 获取 dev 的 HEAD commit
result = subprocess.run(
"git rev-parse dev", shell=True, capture_output=True, text=True,
cwd=r"C:\NeoZQYY", encoding="utf-8",
)
if result.returncode != 0:
print("无法获取 dev 的 HEAD退出")
sys.exit(1)
dev_hash = result.stdout.strip()
print(f"dev HEAD: {dev_hash[:8]}")
ok = True
for branch in ["test", "master"]:
if not sync_branch(branch, dev_hash):
ok = False
print(f"{branch} 同步失败")
# 切回 dev
print(f"\n切回 dev…")
run("git checkout --force dev")
# 恢复 stash如果有
stash_result = subprocess.run(
"git stash list", shell=True, capture_output=True, text=True,
cwd=r"C:\NeoZQYY", encoding="utf-8",
)
if stash_result.stdout.strip():
print("恢复 stash…")
run("git stash pop")
if ok:
print("\n✓ 全部完成。三个分支已对齐。")
else:
print("\n✗ 部分分支同步失败,请检查。")
sys.exit(0 if ok else 1)
if __name__ == "__main__":
main()