基于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网络编程之读取网站根目录实例
Sep 30 Python
Python实现新浪博客备份的方法
Apr 27 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
python调用staf自动化框架的方法
Dec 26 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 Python
详解pyinstaller selenium python3 chrome打包问题
Oct 18 Python
基于python判断目录或者文件代码实例
Nov 29 Python
解决pycharm同一目录下无法import其他文件
Feb 12 Python
python爬虫请求头的使用
Dec 01 Python
python运算符之与用户交互
Apr 13 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
python实现桌面托盘气泡提示
2019/07/29 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
大三自我鉴定范文
2013/10/05 职场文书
自考自我鉴定范文
2013/10/30 职场文书
六年级数学教学反思
2014/02/03 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
民事授权委托书范文
2014/08/02 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
三年级学生评语大全
2014/12/26 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
java设计模式--七大原则详解
2021/07/21 Java/Android