基于python實現(xiàn)操作git過程代碼解析
安裝
pip3 install gitpython
基本使用
# 從遠處倉庫下載代碼到本地 import os from git.repo import Repo # 創(chuàng)建本地存儲地址 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格式字符串 方便后續(xù)反序列化操作 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)
封裝成類
需要使用直接拷貝即可
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參數(shù) env_choices = ( ('prod','正式'), ('test','測試') ) env = models.CharField(max_length=16,verbose_name='環(huán)境',choices=env_choices,default='test')
代碼優(yōu)化
1.公用添加頁面
2.將所有的modlform單獨開設文件夾存儲
3.對modelform再次優(yōu)化 對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='關聯(lián)服務器')
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python GUI庫圖形界面開發(fā)之PyQt5信號與槽事件處理機制詳細介紹與實例解析
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5信號與槽事件處理機制詳細介紹與實例解析,需要的朋友可以參考下2020-03-03Python3+Pygame實現(xiàn)射擊游戲完整代碼
這篇文章主要介紹了Python3+Pygame實現(xiàn)射擊游戲完整代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03OpenCV圖像識別之姿態(tài)估計Pose?Estimation學習
這篇文章主要為大家介紹了OpenCV圖像識別之姿態(tài)估計Pose?Estimation學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05