安装模块
#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()