赞
踩
python有三个git相关的库,分别是gitpython、python-gitlab、gitlab库。
这篇博文主要讲两个库的用法。
安装:
仍然要先安装python专门用来操作git的库,使用pip即可
pip install gitpython
连接:
- from git import Repo
- repo =Repo("/Users/alice/practice") # git文件的路径
操作Git:
repo提供了一些方法可以调用,如下:
- from git import Repo
- repo =Repo("/Users/alice/practice") #git文件的路径
-
- # 克隆 git clone
- repo.clone_from('url','to_path')
-
- # 拉取代码
- repo.remote().pull()
-
- # 获取当前所在的分支 git branch
- print(repo.active_branch)
- # 获取所有分支
- print (repo.branches) # 也可以直接缩写print(r.branches)
- print([str(b) for b in repo.branches])
- print (repo.tags)
- print([str(b) for b in repo.tags])
-
-
- # 创建分支 git branch
- repo.create_head("分支名")
- # 添加版本号 git tag -a
- repo.create_tag("tag号")
-
-
- # 添加到缓存区 git add命令
- # repo.index.add(["文件名"])
-
- # 提交到版本库 git commit -m
- repo.index.commit("message")
-
- # 回退到某个版本 git reset --hard hash
- repo.index.reset(commit="哈希地址",head=True)
-
- # 推送代码到远程分支
- repo.remote().push('远程分支名')
-
- # 查看git log
- repo.iter_commits()
- print([str(i.message) for i in r.iter_commits()]) # 获取提交信息
- print([str(i.message) for i in r.iter_commits()]) # 查看提交的hash值

安装:
仍然要先安装库,使用pip即可
- pip install python-gitlab
-
- # 如果权限问题失败可以使用
- sudo pip install python-gitlab
-
- #如果是本地已安装要升级可以采用
- sudo pip install --upgrade python-gitlab
连接:
- import gitlab
-
- git_url = 'https://gitlab.com/sweet' #gitlab服务端地址
- private_token = 'xxxxxx' #获取git的token
-
- # private token or personal token authentication
- gl = gitlab.Gitlab(git_url, private_token, api_version='4') #api_version默认是4,具体看自己公司的版本
操作Git:
python-gitlab提供了一些方法可以调用,如下:
-
- ## 获取project列表
- projects = git.projects.list()
- print (projects)
- ## 获取所有project
- projects = git.projects.all()
- projects = git.projects.list(all=True)
- for project in projects:
- print (project.name,project.id,projects.http_url_to_repo)
-
- groups = gl.groups.list(all=True)
- for group in all_groups:
- print (group.name,group.id)
-
-
- project = git.projects.get(24664833) #项目的id
- group = gl.groups.get(2)
- commit = project.commits.list()[0] #获取最新的提交人信息,这里我取的第一个人的
- git_name =commit.committer_name #可以直接提取用户信息里的name,也可以获取提交的id,created_at,message
-
-
- members = group.members.list(all=True)
- for me in members:
- print (me.username,me.id)
-
- # 获取git所有的user
- users = gl.users.list(all=True)
- for user in users:
- print (user.username,user.id,user.name,user.state)
-
- # 创建一个新用户
- user_data = {'email': 'jen@foo.com', 'username': 'jen', 'name': 'Jen'}
- user = gl.users.create(user_data)
- print(user)
-
-
- # 示例:获取gitlab指定组内所有user以及project名称以及ID信息,本例中组ID为58
- gid = int(raw_input('Input the group ID: '))
- group = gl.groups.get(gid)
- print (gid, group.name)

了解了git的连接方式,如果希望获取Git上MR的信息,也可以实现了:
- import requests
- import json
-
- def work():
- mrs_url = 'https://gitlab.com/api/v4/projects/2466000000/merge_requests'
-
- headers = {
- "Accept": "application/json, text/plain, */*",
- "PRIVATE-TOKEN": "xxxxxxx",
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
- }
-
- params = {
- "page_size": 20
- }
-
- response = requests.get(mrs_url, headers=headers, params=params)
- result = json.loads(response.text)
- for mr in result:
- print (mr['iid'], mr['state'], mr['merge_status'], mr['author']['name'], mr['title'])
-
- work()
-

运行结果为:
- 2 opened can_be_merged Alice Practice2 merge to master
- 1 opened can_be_merged Alice Practice1 to master
附gitlab的MR返回json信息参考:
- [
- {
- "id":9014000000xx,
- "iid":2,
- "project_id":2466400000xx,
- "title":"Practice2 merge to master",
- "description":"",
- "state":"opened",
- "created_at":"2020-02-27T13:19:07.992Z",
- "updated_at":"2020-02-27T13:19:07.992Z",
- "merged_by":null,
- "merged_at":null,
- "closed_by":null,
- "closed_at":null,
- "target_branch":"master",
- "source_branch":"practice2",
- "user_notes_count":0,
- "upvotes":0,
- "downvotes":0,
- "author":{
- "id":8269000000xx,
- "name":"Alice",
- "username":"sweet",
- "state":"active",
- "avatar_url":"https://assets.gitlab-static.net/uploads/-/system/user/avatar/826900000xx/xx.png",
- "web_url":"https://gitlab.com/sweet"
- },
- "assignees":[
-
- ],
- "assignee":null,
- "reviewers":[
-
- ],
- "source_project_id":2466400000xx,
- "target_project_id":2466400000xx,
- "labels":[
-
- ],
- "work_in_progress":false,
- "milestone":null,
- "merge_when_pipeline_succeeds":false,
- "merge_status":"can_be_merged",
- "sha":"b9f4599858c76a0ccfxx",
- "merge_commit_sha":null,
- "squash_commit_sha":null,
- "discussion_locked":null,
- "should_remove_source_branch":null,
- "force_remove_source_branch":true,
- "reference":"!2",
- "references":{
- "short":"!2",
- "relative":"!2",
- "full":"sweet/practice!2"
- },
- "web_url":"https://gitlab.com/sweet/practice/-/merge_requests/2",
- "time_stats":{
- "time_estimate":0,
- "total_time_spent":0,
- "human_time_estimate":null,
- "human_total_time_spent":null
- },
- "squash":false,
- "task_completion_status":{
- "count":0,
- "completed_count":0
- },
- "has_conflicts":false,
- "blocking_discussions_resolved":true,
- "approvals_before_merge":null
- },
- {
- "id":901400000xx,
- "iid":1,
- "project_id":246600000xx,
- "title":"Practice1 to master",
- "description":"",
- "state":"opened",
- "created_at":"2020-02-27T12:58:55.990Z",
- "updated_at":"2020-02-27T12:58:55.990Z",
- "merged_by":null,
- "merged_at":null,
- "closed_by":null,
- "closed_at":null,
- "target_branch":"master",
- "source_branch":"practice1",
- "user_notes_count":0,
- "upvotes":0,
- "downvotes":0,
- "author":{
- "id":826000000xx,
- "name":"Alice",
- "username":"sweet",
- "state":"active",
- "avatar_url":"https://assets.gitlab-static.net/uploads/-/system/user/avatar/8269000000xx/xx.png",
- "web_url":"https://gitlab.com/sweet"
- },
- "assignees":[
-
- ],
- "assignee":null,
- "reviewers":[
-
- ],
- "source_project_id":2466400000xx,
- "target_project_id":2466400000xx,
- "labels":[
-
- ],
- "work_in_progress":false,
- "milestone":null,
- "merge_when_pipeline_succeeds":false,
- "merge_status":"can_be_merged",
- "sha":"b9f4599858c76axx",
- "merge_commit_sha":null,
- "squash_commit_sha":null,
- "discussion_locked":null,
- "should_remove_source_branch":null,
- "force_remove_source_branch":true,
- "reference":"!1",
- "references":{
- "short":"!1",
- "relative":"!1",
- "full":"sweet/practice!1"
- },
- "web_url":"https://gitlab.com/sweet/practice/-/merge_requests/1",
- "time_stats":{
- "time_estimate":0,
- "total_time_spent":0,
- "human_time_estimate":null,
- "human_total_time_spent":null
- },
- "squash":false,
- "task_completion_status":{
- "count":0,
- "completed_count":0
- },
- "has_conflicts":false,
- "blocking_discussions_resolved":true,
- "approvals_before_merge":null
- }
- ]

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。