基于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中条件选择和循环语句使用方法介绍
Mar 13 Python
Python存取XML的常见方法实例分析
Mar 21 Python
vscode 远程调试python的方法
Dec 01 Python
浅谈用VSCode写python的正确姿势
Dec 16 Python
python opencv之SIFT算法示例
Feb 24 Python
python与caffe改变通道顺序的方法
Aug 04 Python
详解Django的CSRF认证实现
Oct 09 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
详解一种用django_cache实现分布式锁的方式
Sep 01 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 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.MVC的模板标签系统(三)
2006/09/05 PHP
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
纯JS实现轮播图
2017/02/22 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
python3实现指定目录下文件sha256及文件大小统计
2019/02/25 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
全球在线商店:BerryLook
2019/04/14 全球购物
生物专业个人自荐信范文
2013/11/29 职场文书
实习生自我评价
2014/01/18 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
企业职业病防治方案
2014/05/29 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书