基于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根据经纬度计算距离示例
Feb 16 Python
python网络编程学习笔记(10):webpy框架
Jun 09 Python
深入理解Python对Json的解析
Feb 14 Python
Python实现简易端口扫描器代码实例
Mar 15 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
python多线程扫描端口(线程池)
Sep 04 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
python中二分查找法的实现方法
Dec 06 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
pycharm 实现光标快速移动到括号外或行尾的操作
Feb 05 Python
python实现股票历史数据可视化分析案例
Jun 10 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 多行多列显示
2009/08/15 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python中的自省(反射)详解
2015/06/02 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
Python2随机数列生成器简单实例
2017/09/04 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
基于python3生成标签云代码解析
2020/02/18 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
设计师珠宝:Ylang 23
2018/05/11 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
校本教研工作方案
2014/01/14 职场文书
工程承包协议书
2014/10/20 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
django 认证类配置实现
2021/11/11 Python