欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python腳本化Git的操作詳解

 更新時(shí)間:2024年03月15日 08:58:01   作者:郝同學(xué)的測(cè)開筆記  
如何判定此次測(cè)試是否達(dá)標(biāo),代碼覆蓋率是衡量的標(biāo)準(zhǔn)之一,利用fastapi框架重寫了覆蓋率統(tǒng)計(jì)服務(wù),然后通過diff操作統(tǒng)計(jì)增量代碼覆蓋率,當(dāng)然要使用diff操作,避免不了與git打交道,那python如何操作gi t呢,本文將詳細(xì)介紹了Python腳本化Git的操作

前言

如何判定此次測(cè)試是否達(dá)標(biāo),代碼覆蓋率是衡量的標(biāo)準(zhǔn)之一。前段時(shí)間,利用fastapi框架重寫了覆蓋率統(tǒng)計(jì)服務(wù),核心其實(shí)就是先獲取全量代碼覆蓋率,然后通過diff操作統(tǒng)計(jì)增量代碼覆蓋率,當(dāng)然要使用diff操作,避免不了與git打交道,那python如何操作gi t呢?

GitPython

GitPython庫提供了訪問和操作Git倉庫的方法,使得在Python環(huán)境下進(jìn)行Git操作變得非常簡(jiǎn)單。

安裝GitPython

使用pip包管理器來安裝GitPython:

pip install gitpython

克隆倉庫

在開始使用GitPython操作Git倉庫之前,我們首先需要克隆一個(gè)Git倉庫到本地。下面是一個(gè)簡(jiǎn)單的示例代碼:

from git import Repo
?
?
remote_url = 'https://github.com/username/repository.git'
local_path = '/path/to/local/repository'
?
?
Repo.clone_from(remote_url, local_path)

上述代碼中,設(shè)置遠(yuǎn)程倉庫的URL和本地路徑,最后使用Repo.clone_from()方法來克隆遠(yuǎn)程倉庫到本地。

當(dāng)然,如果本地倉庫已經(jīng)存在,就不需要調(diào)用clone_from()進(jìn)行克隆了,可以增加判斷,變?yōu)橄旅孢@樣

remote_url = 'https://github.com/username/repository.git'
local_path = '/path/to/local/repository'
if os.path.exists(local_path):
    repo = Repo(local_path)
else:
    repo = Repo.clone_from(remote_url, local_path)

我們判斷了本地倉庫是否存在,不存在進(jìn)行克隆,如果存在直接實(shí)例化

獲取分支信息

接下來,我們將獲取已克隆倉庫的所有分支信息。

from git import Repo
?
repo_path = '/path/to/your/git/repository'
?
repo = Repo(repo_path)
branches = repo.heads
?
for branch in branches:
    print(f"Branch: {branch.name}, Commit ID: {branch.commit}")

通過heads來獲取所有分支,然后遍歷輸出分支名稱和對(duì)應(yīng)的 commit ID

提交更改

要提交更改,我們需要添加文件到暫存區(qū),并提交更改。

from git import Repo
?
repo_path = '/path/to/your/git/repository'
?
repo = Repo(repo_path)
repo.index.add(['file1.py', 'file2.py'])
repo.index.commit("Commit message")

這部分功能,在代碼覆蓋率統(tǒng)計(jì)中未用到,這里做一個(gè)記錄了解吧。

查看狀態(tài)

from git import Repo
?
?
?
repo_path = '/path/to/your/git/repository'
?
repo = Repo(repo_path)
?
repo_status = repo.git.status()
print(repo_status)

代碼中通過status來查看狀態(tài),其實(shí)和gi t的命令是一樣的。

切換分支和合并代碼

from git import Repo
?
?
?
repo_path = '/path/to/your/git/repository'
repo = Repo(repo_path)
?
repo.git.checkout('develop')
?
repo.git.merge('feature-branch')
?

以上代碼使用checkout切換到指定分支然后使用merge合并代碼。

獲取遠(yuǎn)程倉庫的最新變更

from git import Repo
?
?
repo_path = '/path/to/your/git/repository'
?
repo = Repo(repo_path)
repo.fetch()

從遠(yuǎn)程倉庫獲取最新的提交記錄、分支和文件,但并不自動(dòng)合并到本地代碼。它只是將遠(yuǎn)程倉庫的最新變更拉取到本地,但不會(huì)自動(dòng)更新工作目錄中的文件。這意味著在執(zhí)行 git fetch 后,需要手動(dòng)進(jìn)行合并或重新基于遠(yuǎn)程分支進(jìn)行開發(fā)。

diff操作

from git import Repo
?
?
repo_path = '/path/to/your/git/repository'
?
repo = Repo(repo_path)
repo.git.diff(base_branch, current_branch)

使用 git.diff() 方法比較了 base_branch 和 current_branch 之間的差異

實(shí)戰(zhàn)案例

下面講一下筆者統(tǒng)計(jì)增量覆蓋率的核心代碼

    def get_diff(self, current_branch: str, base_branch: str = "origin/master"):
        """獲取版本之間代碼差異"""
        diff = self.repo.git.diff(base_branch, current_branch).split("\n")
?
        ret = {}
        file_name = ""
        diff_lines = []
        current_line = 0
        for line in diff:
            if line.startswith("diff --git"):
                if file_name != "":
                    ret[file_name] = diff_lines
                file_name = re.findall("b/(\S+)$", line)[0]
                diff_lines = []
                current_line = 0
?
            elif re.match("@@ -\d+,\d+ +(\d+),\d+ @@", line):
                match = re.match("@@ -\d+,\d+ +(\d+),\d+ @@", line)
                current_line = int(match.group(1)) - 1
?
            elif line.startswith("-"):
                continue
            elif line.startswith("+") and not line.startswith("+++"):
                current_line += 1
                diff_lines.append(current_line)
            else:
                current_line += 1
        ret[file_name] = diff_lines
        return ret

這段用于獲取兩個(gè)分支之間的代碼差異。

  • get_diff 方法接受兩個(gè)參數(shù) current_branchbase_branch,分別表示當(dāng)前分支和基準(zhǔn)分支,默認(rèn)為 "origin/master"。
  • 通過調(diào)用 self.repo.git.diff(base_branch, current_branch) 方法獲取基準(zhǔn)分支和當(dāng)前分支之間的代碼差異,并將結(jié)果按行拆分成列表。
  • 使用一個(gè)字典 ret 來存儲(chǔ)代碼差異的信息,其中鍵為文件名,值為差異的行號(hào)列表。
  • 遍歷代碼差異行,根據(jù)行的內(nèi)容進(jìn)行不同的處理:

    • 如果遇到以 "diff --git" 開頭的行,則表示開始處理一個(gè)新文件的差異,提取文件名。
    • 如果匹配到以 "@@ -\d+,\d+ +(\d+),\d+ @@" 格式的行,則提取新版本代碼的起始行號(hào)。
    • 如果遇到以 "-" 開頭的行,則表示該行在基準(zhǔn)分支中有但在當(dāng)前分支中沒有,忽略。
    • 如果遇到以 "+" 開頭且不以 "+++" 開頭的行,則表示該行在當(dāng)前分支中新增,記錄當(dāng)前行號(hào)并添加到差異行列表中。
    • 其他情況下,當(dāng)前行號(hào)遞增。
  • 最后將最后一個(gè)文件的差異行信息添加到字典中,并返回整體的差異信息。

這段代碼的作用是從 Git 中提取兩個(gè)版本之間的代碼差異信息,并以文件名及差異行號(hào)的形式存儲(chǔ)返回。

最后

GitPython極大方便了python操作gi t,讓我更快速的實(shí)現(xiàn)了增量代碼覆蓋率的統(tǒng)計(jì)工作,當(dāng)然這里只是筆者在實(shí)現(xiàn)覆蓋率統(tǒng)計(jì)工作中用到的GitPython相關(guān)的方法,還有更多方法。

以上就是Python腳本化Git的操作詳解的詳細(xì)內(nèi)容,更多關(guān)于Python腳本化Git 的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python機(jī)器學(xué)習(xí)基礎(chǔ)決策樹與隨機(jī)森林概率論

    python機(jī)器學(xué)習(xí)基礎(chǔ)決策樹與隨機(jī)森林概率論

    這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)基礎(chǔ)決策樹與隨機(jī)森林概率論詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • 解決python replace函數(shù)替換無效問題

    解決python replace函數(shù)替換無效問題

    在本篇文章里小編給大家整理的是一篇關(guān)于python replace函數(shù)替換無效問題的解決方法,需要的朋友們可以參考下。
    2020-01-01
  • 關(guān)于opencv讀取和寫入路徑有漢字的處理方式

    關(guān)于opencv讀取和寫入路徑有漢字的處理方式

    這篇文章主要介紹了關(guān)于opencv讀取和寫入路徑有漢字的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python 將Matrix、Dict保存到文件的方法

    Python 將Matrix、Dict保存到文件的方法

    今天小編就為大家分享一篇Python 將Matrix、Dict保存到文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 對(duì)python中的logger模塊全面講解

    對(duì)python中的logger模塊全面講解

    下面小編就為大家分享一篇對(duì)python中的logger模塊全面講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • opencv銀行卡號(hào)識(shí)別的項(xiàng)目實(shí)踐

    opencv銀行卡號(hào)識(shí)別的項(xiàng)目實(shí)踐

    本文主要介紹了opencv銀行卡號(hào)識(shí)別的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Python多進(jìn)程編程multiprocessing代碼實(shí)例

    Python多進(jìn)程編程multiprocessing代碼實(shí)例

    這篇文章主要介紹了Python多進(jìn)程編程multiprocessing代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 對(duì)python讀寫文件去重、RE、set的使用詳解

    對(duì)python讀寫文件去重、RE、set的使用詳解

    今天小編就為大家分享一篇對(duì)python讀寫文件去重、RE、set的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python實(shí)現(xiàn)GB格式序列文件轉(zhuǎn)換Fasta格式文件

    Python實(shí)現(xiàn)GB格式序列文件轉(zhuǎn)換Fasta格式文件

    這篇文章主要為大家介紹了Python實(shí)現(xiàn)GB格式序列文件轉(zhuǎn)換Fasta格式文件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Python Sphinx使用實(shí)例及問題解決

    Python Sphinx使用實(shí)例及問題解決

    這篇文章主要介紹了Python Sphinx使用實(shí)例及問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論