基于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之间的那些事
Jan 07 Python
python实现下载文件的三种方法
Feb 09 Python
详解python的ORM中Pony用法
Feb 09 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 Python
python创建文件时去掉非法字符的方法
Oct 31 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
Jun 24 Python
基于python的itchat库实现微信聊天机器人(推荐)
Oct 29 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
Python 抓取数据存储到Redis中的操作
Jul 16 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
python实现简单的三子棋游戏
Apr 28 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的面向对象编程
2006/10/09 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
利用js对象弹出一个层
2008/03/26 Javascript
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
node.js操作mysql简单实例
2017/05/25 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
解读Django框架中的低层次缓存API
2015/07/24 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
员工评语大全
2014/01/19 职场文书
致长跑运动员广播稿
2014/01/31 职场文书
物业经理自我鉴定
2014/03/03 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
2015大学生求职信范文
2015/03/20 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server
Java实现带图形界面的聊天程序
2022/06/10 Java/Android