安装模块
1 | pip3 install gitpython |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #coding:utf-8 import os from git.repo import Repo from git.repo.fun import is_git_dir #pip3 install gitpython class GitRepository( object ): """ git仓库管理 """ def __init__( self , local_path, repo_url, branch = 'master' ): self .local_path = local_path self .repo_url = repo_url self .repo = None self .init_git(repo_url, branch) def init_git( self , repo_url, branch): """ 初始化git仓库 :param repo_url: :param branch: :return: """ if not os.path.exists( self .local_path): os.makedirs( self .local_path) git_local_path = os.path.join( self .local_path, '.git' ) if not is_git_dir(git_local_path): self .repo = Repo.clone_from(repo_url, to_path = self .local_path, branch = branch) # 克隆仓库 else : self .repo = Repo( self .local_path) # 选择已有仓库 def pull( self ): """ 从线上拉最新代码 :return: """ self .repo.git.pull() def branches( self ): """ 获取所有分支 :return: """ branches = self .repo.remote().refs return [item.remote_head for item in branches if item.remote_head not in [ 'HEAD' , ]] def commits( self ): """ 获取所有提交记录 :return: """ commit_log = self .repo.git.log( '--pretty={"commit":"%h","author":"%an","summary":"%s","date":"%cd"}' , max_count = 50 , date = 'format:%Y-%m-%d %H:%M' ) log_list = commit_log.split( "\n" ) return [ eval (item) for item in log_list] def tags( self ): """ 获取所有tag :return: """ return [tag.name for tag in self .repo.tags] def change_to_branch( self , branch): """ 切换分值 :param branch: :return: """ self .repo.git.checkout(branch) def change_to_commit( self , branch, commit): """ 切换commit :param branch: :param commit: :return: """ self .change_to_branch(branch = branch) self .repo.git.reset( '--hard' , commit) def change_to_tag( self , tag): """ 切换tag :param tag: :return: """ self .repo.git.checkout(tag) def add( self , file = "." ): # 添加文件 可以是单个文件名,也可以是`[ ]`数组,还可以是`.`代表全部 self .repo.git.add( file ) def commit( self ,msg): # commit提交 self .repo.git.commit(m = msg) def push( self ,to_branch = "master" ): return self .repo.git.push( '--progress' , 'origin' , to_branch) if __name__ = = '__main__' : remote_path = "git@test.com/abc/boye.git" local_path = os.path.join( 'D:/test/git' , 'boye' ) repo = GitRepository(local_path,remote_path) branch_list = repo.branches() print (branch_list) repo.add() repo.commit( "test" ) print (repo.push()) # repo.change_to_branch('dev') # repo.pull() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统