基于python实现操作git过程代码解析


Posted in Python onJuly 27, 2020

安装

pip3 install gitpython

基本使用

# 从远处仓库下载代码到本地
import os
from git.repo import Repo

# 创建本地存储地址
download_path = os.path.join('jason','NB')
# 从远程仓库下载代码
Repo.clone_from('https://github.com/DominicJi/TeachTest.git',to_path=download_path,branch='master')

常用方法大全

# ############## 2. pull最新代码 ##############
import os
from git.repo import Repo
 
local_path = os.path.join('jason', 'NB')
repo = Repo(local_path)
repo.git.pull()

# ############## 3. 获取所有分支 ##############
import os
from git.repo import Repo
 
local_path = os.path.join('jason', 'NB')
repo = Repo(local_path)
 
branches = repo.remote().refs
for item in branches:
  print(item.remote_head)
  
# ############## 4. 获取所有版本 ##############
import os
from git.repo import Repo
 
local_path = os.path.join('jason', 'NB')
repo = Repo(local_path)
 
for tag in repo.tags:
  print(tag.name)

# ############## 5. 获取所有commit ##############
import os
from git.repo import Repo
 
local_path = os.path.join('jason', 'NB')
repo = Repo(local_path)
 
# 将所有提交记录结果格式成json格式字符串 方便后续反序列化操作
commit_log = 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")
real_log_list = [eval(item) for item in log_list]
print(real_log_list)
 
# ############## 6. 切换分支 ##############
import os
from git.repo import Repo
 
local_path = os.path.join('jason', 'NB')
repo = Repo(local_path)
 
before = repo.git.branch()
print(before)
repo.git.checkout('master')
after = repo.git.branch()
print(after)
repo.git.reset('--hard', '854ead2e82dc73b634cbd5afcf1414f5b30e94a8')
 
# ############## 7. 打包代码 ##############
with open(os.path.join('jason', 'NB.tar'), 'wb') as fp:
  repo.archive(fp)

基于python实现操作git过程代码解析 

封装成类

需要使用直接拷贝即可

import os
from git.repo import Repo
from git.repo.fun import is_git_dir


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.initial(repo_url, branch)

  def initial(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)


if __name__ == '__main__':
  local_path = os.path.join('codes', 'luffycity')
  repo = GitRepository(local_path,remote_path)
  branch_list = repo.branches()
  print(branch_list)
  repo.change_to_branch('dev')
  repo.pull()

项目代码

服务器管理

class Project(models.Model):
  """
  项目表
  """
  title = models.CharField(max_length=32,verbose_name='项目名')
  repo = models.CharField(max_length=255,verbose_name='仓库地址')
  # choices参数
  env_choices = (
    ('prod','正式'),
    ('test','测试')
  )
  env = models.CharField(max_length=16,verbose_name='环境',choices=env_choices,default='test')

代码优化

1.公用添加页面

2.将所有的modlform单独开设文件夹存储

3.对modelform再次优化 对modelform定义一个父类

from django.forms import ModelForm
class BaseModelForm(ModelForm):
  # 将不需要bootstrap样式的字段放入
  exclude_bootstrap = []
  def __init__(self,*args,**kwargs):
    super().__init__(*args,**kwargs)
    # 给字段加上form-control样式
    # self.fields = {'字段名':字段对象}
    for k,field in self.fields.items():
      if k in self.exclude_bootstrap: # 排除不需要加样式的字段
        continue
      field.widget.attrs['class'] = 'form-control'
          
# 其他modelform书写
from app01 import models
from app01.myform.mybase import BaseModelForm
class ProjectModelForm(BaseModelForm):
  class Meta:
    model = models.Project
    fields = '__all__'

4.给项目表新增线上项目地址和服务器字段

# 扩展字段
path = models.CharField(max_length=255,verbose_name='线上项目地址',default='/data/tmp')
# 项目与服务器的关系表
servers = models.ManyToManyField(to='Server',verbose_name='关联服务器')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的多态性实例分析
Jul 07 Python
Python的requests网络编程包使用教程
Jul 11 Python
Python+微信接口实现运维报警
Aug 27 Python
python通过opencv实现批量剪切图片
Nov 13 Python
Python实现读写INI配置文件的方法示例
Jun 09 Python
python 常见字符串与函数的用法详解
Nov 23 Python
Django 数据库同步操作技巧详解
Jul 19 Python
解决Mac下使用python的坑
Aug 13 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
Python3实现二叉树的最大深度
Sep 30 Python
python操作xlsx格式文件并读取
Jun 02 Python
Python 中的单分派泛函数你真的了解吗
Jun 22 Python
2021年的Python 时间轴和即将推出的功能详解
Jul 27 #Python
经验丰富程序员才知道的8种高级Python技巧
Jul 27 #Python
在 Windows 下搭建高效的 django 开发环境的详细教程
Jul 27 #Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 #Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 #Python
Python性能分析工具py-spy原理用法解析
Jul 27 #Python
python下载的库包存放路径
Jul 27 #Python
You might like
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
Div Select挡住的解决办法
2008/08/07 Javascript
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
javascript动态获取登录时间和在线时长
2016/02/25 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
JavaScript canvas实现雨滴特效
2021/01/10 Javascript
python实现的udp协议Server和Client代码实例
2014/06/04 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
pytorch打印网络结构的实例
2019/08/19 Python
python批量修改xml属性的实现方式
2020/03/05 Python
python3的pip路径在哪
2020/06/23 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
python如何实时获取tcpdump输出
2020/09/16 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
电子专业毕业生自我鉴定
2014/01/22 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
python常见的占位符总结及用法
2021/07/02 Python
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python