日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

卧槽?用 Python 还能玩 Git?

發(fā)布時(shí)間:2024/9/15 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卧槽?用 Python 还能玩 Git? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:匿蟒

鏈接:https://note.qidong.name/2018/01/gitpython

有時(shí),需要做復(fù)雜的 Git 操作,并且有很多中間邏輯。用 Shell 做復(fù)雜的邏輯運(yùn)算與流程控制就是一個(gè)災(zāi)難。所以,用 Python 來實(shí)現(xiàn)是一個(gè)愉快的選擇。這時(shí),就需要在 Python 中操作 Git 的庫。

0. GitPython 簡介

GitPython是一個(gè)與Git庫交互的Python庫,包括底層命令(Plumbing)與高層命令(Porcelain)。它可以實(shí)現(xiàn)絕大部分的Git讀寫操作,避免了頻繁與Shell交互的畸形代碼。它并非是一個(gè)純粹的Python實(shí)現(xiàn),而是有一部分依賴于直接執(zhí)行g(shù)it命令,另一部分依賴于GitDB。

GitDB也是一個(gè)Python庫。它為.git/objects建立了一個(gè)數(shù)據(jù)庫模型,可以實(shí)現(xiàn)直接的讀寫。由于采用流式(stream)讀寫,所以運(yùn)行高效、內(nèi)存占用低。

1. GitPython安裝

pip?install?GitPython

其依賴GitDB會(huì)自動(dòng)安裝,不過可執(zhí)行的git命令需要額外安裝。

另外在 Windows 下,需要添加環(huán)境變量。方法是:使用你的 everything 搜索 git-daemon.exe 在哪個(gè)目錄下,復(fù)制這個(gè)路徑設(shè)置到 PATH 里去。

在 Linux 下,需要先執(zhí)行:./init-tests-after-clone.sh,配置一下,那么這個(gè)文件從哪來呢?在 Github 上:https://github.com/gitpython-developers/GitPython

2. 基本用法

init

import?git repo?=?git.Repo.init(path='.')

這樣就在當(dāng)前目錄創(chuàng)建了一個(gè)Git庫。當(dāng)然,路徑可以自定義。

由于git.Repo實(shí)現(xiàn)了__enter__與__exit__,所以可以與with聯(lián)合使用。

with?git.Repo.init(path='.')?as?repo:#?do?sth?with?repo

不過,由于只是實(shí)現(xiàn)了一些清理操作,關(guān)閉后仍然可以讀寫,所以使用這種形式的必要性不高。詳見附錄。

clone

clone分兩種。一是從當(dāng)前庫clone到另一個(gè)位置:

new_repo?=?repo.clone(path='../new')

二是從某個(gè)URL那里clone到本地某個(gè)位置:

new_repo?=?git.Repo.clone_from(url='git@github.com:USER/REPO.git',?to_path='../new')

commit

with?open('test.file',?'w')?as?fobj:fobj.write('1st?line\n') repo.index.add(items=['test.file']) repo.index.commit('write?a?line?into?test.file')with?open('test.file',?'aw')?as?fobj:fobj.write('2nd?line\n') repo.index.add(items=['test.file']) repo.index.commit('write?another?line?into?test.file')

status

GitPython并未實(shí)現(xiàn)原版git status,而是給出了部分的信息。

>>>?repo.is_dirty() False >>>?with?open('test.file',?'aw')?as?fobj: >>>?????fobj.write('dirty?line\n') >>>?repo.is_dirty() True >>>?repo.untracked_files [] >>>?with?open('untracked.file',?'w')?as?fobj: >>>?????fobj.write('') >>>?repo.untracked_files ['untracked.file']

checkout(清理所有修改)

>>>?repo.is_dirty() True >>>?repo.index.checkout(force=True) <generator?object?<genexpr>?at?0x7f2bf35e6b40> >>>?repo.is_dirty() False

branch

獲取當(dāng)前分支:

head?=?repo.head

新建分支:

new_head?=?repo.create_head('new_head',?'HEAD^')

切換分支:

new_head.checkout() head.checkout()

刪除分支:

git.Head.delete(repo,?new_head) #?or git.Head.delete(repo,?'new_head')

merge

以下演示如何在一個(gè)分支(other),merge另一個(gè)分支(master)。

master?=?repo.heads.master other?=?repo.create_head('other',?'HEAD^') other.checkout() repo.index.merge_tree(master) repo.index.commit('Merge?from?master?to?other')

remote, fetch, pull, push

創(chuàng)建remote:

remote?=?repo.create_remote(name='gitlab',?url='git@gitlab.com:USER/REPO.git')

遠(yuǎn)程交互操作:

remote?=?repo.remote() remote.fetch() remote.pull() remote.push()

刪除remote:

repo.delete_remote(remote) #?or repo.delete_remote('gitlab')

其它

其它還有Tag、Submodule等相關(guān)操作,不是很常用,這里就不介紹了。

GitPython的優(yōu)點(diǎn)是在做讀操作時(shí)可以方便地獲取內(nèi)部信息,缺點(diǎn)是在做寫操作時(shí)感覺很不順手,隔靴搔癢。當(dāng)然,它還支持直接執(zhí)行g(shù)it操作。

git?=?repo.git git.status() git.checkout('HEAD',?b="my_new_branch") git.branch('another-new-one') git.branch('-D',?'another-new-one')

這……感覺又回到了老路,而且仍然感覺怪怪的。

3. 其它操作Git的方法

subprocess

這就是所謂『老路』。在另一個(gè)進(jìn)程,執(zhí)行Shell命令,并通過stdio來解析返回結(jié)果。

import?subprocess subprocess.call(['git',?'status'])

dulwich

dulwich是一個(gè)純Python實(shí)現(xiàn)的Git交互庫,以后有空再研究吧。

官方網(wǎng)站:https://www.dulwich.io/

pygit2

pygit2是基于libgit2實(shí)現(xiàn)的一個(gè)Python庫。底層是C,而上層Python只是接口,運(yùn)行效率應(yīng)該是最高的,然而孤還是放棄了。其缺點(diǎn)是,需要環(huán)境中預(yù)先安裝libgit2。相比之下,GitPython只需要環(huán)境預(yù)置Git,簡單多了。

官方網(wǎng)站:http://www.pygit2.org/

4. 參考閱讀

  • 《GitPython Documentation》

  • 《Welcome to GitDB’s documentation!》

  • 《Git - 底層命令 (Plumbing) 和高層命令 (Porcelain)》

  • 《GitPython | Hom》

? ???精 彩 文 章?

  • Python騷操作!你還在用PS制作電子簽名嗎?

  • 萬字案例 | 用Python建立客戶流失預(yù)測模型(含源數(shù)據(jù)+代碼)

  • 網(wǎng)站不讓復(fù)制文字??教你破解復(fù)制+白嫖下載百度等各種文檔

END 最后說個(gè)題外話,相信大家都知道視頻號(hào)了,隨著灰度范圍擴(kuò)大,越來越多的小伙伴都開通了視頻號(hào)。小詹也開通了一個(gè)視頻號(hào),會(huì)分享互聯(lián)網(wǎng)那些事、讀書心得與副業(yè)經(jīng)驗(yàn),歡迎掃碼關(guān)注,和小詹一起向上生長!「沒有開通發(fā)布權(quán)限的盡量多互動(dòng),提升活躍度可以更快開通哦」

總結(jié)

以上是生活随笔為你收集整理的卧槽?用 Python 还能玩 Git?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。