Python中如何实现Leetcode刷题后自动同步代码到Github

老实说题目暂时没刷多少,先写个自动下载代码并生成自动生成 Readme 的工具方便发布到 Github

详情见 https://github.com/bonfy/leetcode

前方预警,注意里面的 leetcode_generate.py

无图无真相


Python中如何实现Leetcode刷题后自动同步代码到Github

14 回复

虽然看起来很厉害, 但是这个究竟是干什么的?


这个需求很实用,我通常用一个脚本搞定。核心思路是:刷完题后,脚本自动将指定目录的代码提交到GitHub。

下面是一个完整的实现方案。你需要先准备好GitHub仓库,并配置好SSH密钥。

import os
import subprocess
import datetime
import json
from pathlib import Path

class LeetcodeGitSync:
    def __init__(self, repo_path, leetcode_dir, github_url):
        """
        repo_path: 本地Git仓库路径
        leetcode_dir: LeetCode代码存放目录
        github_url: GitHub仓库URL
        """
        self.repo_path = Path(repo_path)
        self.leetcode_dir = Path(leetcode_dir)
        self.github_url = github_url
        
        # 确保目录存在
        self.repo_path.mkdir(parents=True, exist_ok=True)
        self.leetcode_dir.mkdir(parents=True, exist_ok=True)
        
        # 初始化Git仓库(如果不存在)
        self._init_git_repo()
    
    def _run_git_command(self, cmd):
        """执行Git命令"""
        try:
            result = subprocess.run(
                cmd,
                cwd=self.repo_path,
                shell=True,
                capture_output=True,
                text=True
            )
            if result.returncode != 0:
                print(f"Git命令执行失败: {cmd}")
                print(f"错误信息: {result.stderr}")
            return result
        except Exception as e:
            print(f"执行Git命令时出错: {e}")
            return None
    
    def _init_git_repo(self):
        """初始化Git仓库"""
        if not (self.repo_path / ".git").exists():
            print("初始化Git仓库...")
            self._run_git_command("git init")
            self._run_git_command(f"git remote add origin {self.github_url}")
    
    def sync_to_github(self, commit_message=None):
        """同步代码到GitHub"""
        if not commit_message:
            commit_message = f"LeetCode刷题更新 {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
        
        # 复制LeetCode代码到仓库
        self._copy_leetcode_files()
        
        # 检查是否有变更
        status_result = self._run_git_command("git status --porcelain")
        if not status_result.stdout.strip():
            print("没有检测到代码变更,跳过提交")
            return
        
        # 添加所有文件
        print("添加文件到Git...")
        self._run_git_command("git add .")
        
        # 提交
        print("提交更改...")
        self._run_git_command(f'git commit -m "{commit_message}"')
        
        # 推送到GitHub
        print("推送到GitHub...")
        push_result = self._run_git_command("git push origin main")
        
        if push_result and push_result.returncode == 0:
            print("✅ 代码已成功同步到GitHub!")
        else:
            print("❌ 推送失败,请检查网络或仓库权限")
    
    def _copy_leetcode_files(self):
        """复制LeetCode代码文件到Git仓库"""
        import shutil
        
        # 清空目标目录(保留.git文件夹)
        for item in self.repo_path.iterdir():
            if item.name != ".git":
                if item.is_dir():
                    shutil.rmtree(item)
                else:
                    item.unlink()
        
        # 复制LeetCode文件
        for item in self.leetcode_dir.iterdir():
            if item.is_file() and item.suffix in ['.py', '.java', '.cpp', '.js']:
                shutil.copy2(item, self.repo_path / item.name)
            elif item.is_dir():
                shutil.copytree(item, self.repo_path / item.name, dirs_exist_ok=True)
        
        # 创建README文件(可选)
        readme_content = f"""# LeetCode Solutions
自动同步于 {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}

包含以下题目:
{self._generate_problem_list()}
"""
        (self.repo_path / "README.md").write_text(readme_content)
    
    def _generate_problem_list(self):
        """生成题目列表"""
        problems = []
        for file in self.repo_path.glob("*.py"):
            problems.append(f"- {file.stem}")
        return "\n".join(problems)


# 使用示例
if __name__ == "__main__":
    # 配置参数
    REPO_PATH = "/path/to/your/git/repo"  # 本地Git仓库路径
    LEETCODE_DIR = "/path/to/your/leetcode/solutions"  # LeetCode代码目录
    GITHUB_URL = "git@github.com:yourusername/leetcode-solutions.git"  # GitHub仓库URL
    
    # 创建同步器并执行
    sync = LeetcodeGitSync(REPO_PATH, LEETCODE_DIR, GITHUB_URL)
    sync.sync_to_github()

使用说明:

  1. 安装依赖:只需要Python标准库,无需额外安装
  2. 配置参数:修改脚本底部的三个路径参数
  3. 定时执行:可以设置cron job(Linux/Mac)或计划任务(Windows)自动运行
  4. 手动触发:刷完题后直接运行脚本

进阶优化(如果你需要):

  • 添加.gitignore文件忽略不必要的文件
  • 支持按题目分类存储
  • 添加提交前代码检查
  • 记录刷题统计信息

这个脚本的核心就是自动化的文件复制和Git操作,你可以根据自己的目录结构进行调整。

一句话总结:用Python脚本自动化Git操作,实现刷题代码自动同步。

用来下载自己写过的 solution

楼上正解,握爪

哦 这样的话 看起来还不错

挺方便的,谢谢楼主

看了楼主的工具,去完成了我的第一道题目

:smiley:

目前只做了 20 道

我也只做了一点点, 慢慢来嘛 :)

请问 你代码实现是不是上传的 运行时间最短的?我想只上传最近一次提交的,怎么修改代码?多谢!

楼主你好,我用你这个 generate 出了点问题,已经开 issue 了,求解决下。T T
https://github.com/bonfy/leetcode/issues/17

回到顶部