Git_Ctrl.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # -*- coding: <encoding name> -*-
  2. from git import Repo
  3. from os.path import split,exists
  4. import os
  5. import subprocess
  6. sys_seeting = dict(shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  7. git_path = 'git'
  8. class git_Repo:#git的基类
  9. def __init__(self,Dic,name,*args,**kwargs):
  10. self.Repo_Dic = Dic # 仓库地址
  11. self.url = None
  12. if not exists(Dic + r'/.git'): # 是否为git 仓库
  13. subprocess.Popen(f'{git_path} init',cwd=self.Repo_Dic,**sys_seeting).wait()
  14. self.repo = Repo(Dic)
  15. self.name = name
  16. def Flie_List(self,file_list,is_file=True,pat=' '):
  17. if file_list == '*':
  18. file = '*'
  19. else:
  20. file_ = []
  21. for i in file_list:
  22. if i[:len(self.Repo_Dic)] == self.Repo_Dic:
  23. file_.append(i[len(self.Repo_Dic) + 1:]) # +1是为了去除/
  24. if not is_file:return file_
  25. file = pat.join(file_)
  26. return file
  27. def dir_list(self,all=True):
  28. listfile = []
  29. if all:
  30. listfile += [f'[当前分支] {self.repo.active_branch} 工作区{"不" if self.repo.is_dirty() else ""}干净 -> {self.name}']
  31. listfile += [f'{"[配置文件]" if i == ".git" else "[未跟踪]"if i in self.repo.untracked_files else "[已跟踪]"} {i}'
  32. for i in os.listdir(self.Repo_Dic)]
  33. return listfile
  34. def Add_File(self,file_list):
  35. file = self.Flie_List(file_list)
  36. return subprocess.Popen(f'{git_path} add {file}',cwd=self.Repo_Dic,**sys_seeting)
  37. def Commit_File(self,m):
  38. return subprocess.Popen(f'{git_path} commit -m "{m}"',cwd=self.Repo_Dic,**sys_seeting)
  39. def Status(self):#执行status
  40. return subprocess.Popen(f'{git_path} status',cwd=self.Repo_Dic,**sys_seeting)
  41. def Log(self):#执行log
  42. return subprocess.Popen(f'{git_path} log',cwd=self.Repo_Dic,**sys_seeting)
  43. def refLog(self):#执行reflog
  44. return subprocess.Popen(f'{git_path} reflog',cwd=self.Repo_Dic,**sys_seeting)
  45. def Diff_File(self,MASTER='HEAD'):#执行diff
  46. return subprocess.Popen(f'{git_path} diff {MASTER}',cwd=self.Repo_Dic,**sys_seeting)
  47. def reset(self,HEAD='HEAD~1'):
  48. return subprocess.Popen(f'{git_path} reset --hard {HEAD}',cwd=self.Repo_Dic,**sys_seeting)
  49. def checkout(self,file_list):
  50. if len(file_list) >= 1:#多于一个文件,不用--,空格
  51. file = self.Flie_List(file_list,pat=' ')
  52. return subprocess.Popen(f'{git_path} checkout {file}',cwd=self.Repo_Dic,**sys_seeting)
  53. elif len(file_list) == 1:
  54. return subprocess.Popen(f'{git_path} checkout -- {file_list[0]}', cwd=self.Repo_Dic, **sys_seeting)
  55. else:
  56. return subprocess.Popen(f'{git_path} checkout *', cwd=self.Repo_Dic, **sys_seeting)
  57. def rm(self,file_list):#删除版本库中的文件
  58. file = self.Flie_List(file_list)
  59. return subprocess.Popen(f'{git_path} rm {file}', cwd=self.Repo_Dic,**sys_seeting)
  60. class Clone_git(git_Repo):#Clone一个git
  61. def __init__(self,Dic,url,name,*args,**kwargs):
  62. super(Clone_git, self).__init__(Dic,name, *args, **kwargs)
  63. self.url = url
  64. Repo.clone_from(url=url,to_path=Dic)
  65. self.git = self.repo.git
  66. self.index = self.repo.index
  67. class git_Ctrol:
  68. def __init__(self):
  69. self.git_Dic = {}#名字-文件位置
  70. self.gitType_Dic = {}#名字-类型
  71. def Add_init(self,Dic,**kwargs):
  72. name = split(Dic)[-1]
  73. git = git_Repo(Dic,name)
  74. self.git_Dic[name] = git
  75. self.gitType_Dic[name] = 'init'
  76. def Clone_init(self,Dic,url,**kwargs):
  77. name = split(Dic)[-1]
  78. git = Clone_git(Dic,url,name)
  79. self.git_Dic[name] = git
  80. self.gitType_Dic[name] = 'clone'
  81. def get_git(self,name):
  82. return self.git_Dic[name]
  83. def get_git_Dic(self):
  84. return self.git_Dic.copy()
  85. def get_Dir(self,name):
  86. return self.get_git(name).dir_list()
  87. def add_File(self,name,dic_list):
  88. return self.get_git(name).Add_File(dic_list)
  89. def commit_File(self,name,m):
  90. return self.get_git(name).Commit_File(m)
  91. def log(self,name):
  92. return self.get_git(name).Log()
  93. def reflog(self,name):
  94. return self.get_git(name).refLog()
  95. def status(self,name):
  96. return self.get_git(name).Status()
  97. def diff_File(self,name,MASTER):
  98. return self.get_git(name).Diff_File(MASTER)
  99. def back_version(self,name,HEAD):
  100. return self.get_git(name).reset(HEAD)
  101. def checkout_version(self,name,file):
  102. return self.get_git(name).checkout(file)
  103. def rm(self,name,file):
  104. return self.get_git(name).rm(file)