首页 > 编程语言 >python操作git

python操作git

时间:2023-04-07 16:13:34浏览次数:46  
标签:git python self repo branch path 操作 local

安装模块

pip3 install gitpython

  

#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="[email protected]/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()

  

标签:git,python,self,repo,branch,path,操作,local
From: https://www.cnblogs.com/boye169/p/17296475.html

相关文章

  • Python 之生成验证码
    一、代码importrandomfromioimportBytesIOfromPILimportImage,ImageDraw,ImageFont,ImageFilterclassCaptcha:def__init__(self,width,height,code_num=4,code_type=1,font_size=24,is_blur=True,font='Arial.ttf',x_......
  • Python求100以内的素数常用方法!
    与其他编程语言对比,Python拥有十分独特的优势代码量少,相同功能其他编程语言需要上百行代码才可以实现,而Python只需要十几行就可以实现。而且在Python中,我们只需要学会一些基础的语法就可以实现简单的数值计算,那么Python求100内的所有素数方法是什么?具体内容请看下文。质数......
  • django记录基础操作日志
    1.新增middleware.py中间件:需要在setting.py注册classLoggingMiddleware:"""日志记录模块:操作用户、操作ip、请求路径、请求方式、请求时间"""def__init__(self,get_response):self.get_response=get_responsedef__call__(self,......
  • Python中的时间函数strftime与strptime对比
    一、striftime将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串,控制输出格式.date、datetime、time对象都支持strftime(format) 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。用法:datetime.strftime(format)importdatetimedt=datetime.dateti......
  • python+playwright 学习-50 pytest-playwright 多账号操作解决方案
    前言pytest-playwright插件可以让我们快速编写pytest格式的测试用例,它提供了一个内置的page对象,可以直接打开页面操作。但是有时候我们需要2个账号是操作业务流程,比如A账号创建了一个任务,需要用到B账号去操作审批动作等。如果需要2个账号同时登录,可以使用context上下文,它可......
  • Python源码笔记——Python中的列表对象
    1.列表结构体#definePyObject_VAR_HEADPyVarObjectob_base;typedefstruct{PyObjectob_base;Py_ssize_tob_size;/*Numberofitemsinvariablepart*/}PyVarObject;typedefstruct{PyObject_VAR_HEAD/*Vectorofpointerstolistel......
  • 安装wsl的必备操作——开启CPU虚拟化——WslRegisterDistribution failed with error_
    参考:https://www.cnblogs.com/smdtxz/p/16837946.htmlhttps://www.cnblogs.com/wenonly/p/17206040.htmlhttps://blog.csdn.net/qq_41460654/article/details/118026986  ======================================================  因为实验室需要炼丹,而炼丹要用ubun......
  • Python源码笔记——Python对象机制的基石【PyObject】
    所有源码均基于Python3.11.21.PyObject定义//实际上没有任何东西被声明为PyObject,但是每个指向Python对象的指针都可以转换为PyObject*。//这是手动模拟的继承。同样的,每个指向可变大小的Python对象的指针也可以转换为PyObject*,此外,也可以转换为PyVarObject*。typedefst......
  • Python源码笔记——Python中的整数对象
    1.整数对象在Python3.11.2中,整数结构体叫做PyLongObject。#ifPYLONG_BITS_IN_DIGIT==30typedefuint32_tdigit;...#elifPYLONG_BITS_IN_DIGIT==15typedefunsignedshortdigit;...#else#error"PYLONG_BITS_IN_DIGITshouldbe15or30"#endiftypedefstruc......
  • Python selenium过图片滑块验证
    计算滑块移动距离defget_distance(image1,image2):'''拿到滑动验证码需要移动的距离:paramimage1:没有缺口的图片对象:paramimage2:带缺口的图片对象:return:需要移动的距离'''#print('size',image1.size)threshold=5......