python 操作 Git

雪花飄發表於2019-07-27
  • 在搭建 devops 平臺時有一個小功能是獲取倉庫的分支或者標籤列表,遂使用 python 寫了相關指令碼

  • python 安裝包 GitPython 並且 import git

  • 相關指令碼

# 倉庫操作物件
    def get_repo_target(self, addr):
        #取倉庫地址作為目錄名
        repo_name = addr.replace('/', '-')
        try:
            #在特定目錄獲取倉庫操作物件
            repo = git.Repo(self.temp_dir + repo_name)
            #設定git拉取程式碼身份驗證使用的私鑰地址,剛開始使用GIT_SSH引數,值為私鑰地址不起作用
            repo.git.update_environment(
                GIT_SSH_COMMAND='ssh -i ' + self.get_key_path(addr))
            Debug.info('已經存在倉庫:' + addr)
        except Exception as e:
            Debug.info('未初始化倉庫')
            Debug.error(str(e))
            Debug.info('初始化倉庫')
            #未初始化過倉庫,在特定目錄初始化倉庫操作物件
            repo = git.Repo.init(self.temp_dir + repo_name)
            Debug.info('新增遠端倉庫')
            repo.create_remote('origin', addr)

        Debug.info('fetch遠端倉庫資料')
        try:
            #獲取倉庫最新資訊
            repo.git.fetch('--all')
        except Exception as e:
            Debug.info('fetch倉庫資料資訊失敗')
            Debug.error(str(e))

        return repo

這裡可能還要執行一下命令 mkdir /root/.ssh && echo 'StrictHostKeyChecking no' > /root/.ssh/config , 要不然在初次獲取倉庫主機資訊時有個known_hosts的互動確認,這裡是免互動確認

  • 獲取分支指令碼
# 獲取倉庫分支
    def get_branches(self, address):
        repo = self.get_repo_target(address)
        Debug.info('獲取遠端分支資訊')
        branches = repo.git.branch('-r')
        branches = branches.split("\n")
        Debug.info(branches)
        filter_branches = []
        #這裡去除 origin
        for item in branches:
            pos = item.find('/')
            filter_branches.append(item[pos+1:])
        return filter_branches
  • 獲取標籤列表
    # 獲取倉庫tag
    def get_tags(self, address):
        repo = self.get_repo_target(address)
        Debug.info('獲取tag資訊')
        #獲取標籤及標籤提交資訊
        tags = repo.git.tag('-ln')
        filter_tags = []
        tags = tags.split("\n")
        Debug.info(tags)
        #分享標籤和標籤提交資訊,這裡發現標籤提交時如果未加 -m,會使用上次使用的提交資訊
        for item in tags:
            pos = item.find(" ")
            tag_temp = {"name": item[:pos], "msg": item[pos:].strip()}
            filter_tags.append(tag_temp)
        return filter_tags
本作品採用《CC 協議》,轉載必須註明作者和本文連結
雪花飄