基于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实现股市信息下载的方法
Jun 15 Python
十个Python程序员易犯的错误
Dec 15 Python
轻松掌握python设计模式之策略模式
Nov 18 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 Python
Python中用post、get方式提交数据的方法示例
Sep 22 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
python爬取个性签名的方法
Jun 17 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
Django 再谈一谈json序列化
Mar 16 Python
python基于opencv实现人脸识别
Jan 04 Python
Autopep8的使用(python自动编排工具)
Mar 02 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
PHP 模拟$_PUT实现代码
2010/03/15 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
Jquery获取radio选中值实例总结
2019/01/17 jQuery
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
Python批量更改文件名的实现方法
2017/10/29 Python
深入理解Django-Signals信号量
2019/02/19 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
四年级学生评语大全
2014/04/21 职场文书
会计求职自荐信
2014/06/20 职场文书
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android