git add后取消_Python 命令行之旅:使用 click 实现 git 命令
作者:HelloGitHub-Prodesire
一、前言
在前面五篇介紹 click 的文章中,我們?nèi)媪私饬?click 的強大能力。按照慣例,我們要像使用 argparse 和 docopt 一樣使用 click 來實現(xiàn) git 命令。
本文的關(guān)注點并不在 git 的各種命令是如何實現(xiàn)的,而是怎么使用 click 去打造一個實用命令行程序,代碼結(jié)構(gòu)是怎樣的。因此,和 git 相關(guān)的操作,將會使用 gitpython 庫來簡單實現(xiàn)。
為了讓沒讀過 使用 xxx 實現(xiàn) git 命令(xxx 指 argparse 和 docopt) 的小伙伴也能讀明白本文,我們?nèi)詴?git 常用命令和 gitpython 做一個簡單介紹。
本系列文章默認使用 Python 3 作為解釋器進行講解。若你仍在使用 Python 2,請注意兩者之間語法和庫的使用差異哦~二、git 常用命令
當你寫好一段代碼或增刪一些文件后,會用如下命令查看文件狀態(tài):
git status確認文件狀態(tài)后,會用如下命令將的一個或多個文件(夾)添加到暫存區(qū):
git add [pathspec [pathspec ...]]然后使用如下命令提交信息:
git commit -m "your commit message"最后使用如下命令將提交推送到遠程倉庫:
git push我們將使用 click 和 gitpython 庫來實現(xiàn)這 4 個子命令。
三、關(guān)于 gitpython
gitpython 是一個和 git 倉庫交互的 Python 第三方庫。我們將借用它的能力來實現(xiàn)真正的 git 邏輯。
安裝:
pip install gitpython四、思考
在實現(xiàn)前,我們不妨先思考下會用到 click 的哪些功能?整個程序的結(jié)構(gòu)是怎樣的?
click
git 的 4 個子命令的實現(xiàn)其實對應(yīng)于四個函數(shù),每個函數(shù)使用 click 的 command 來裝飾。而對于 git add 和 git commit,則分別需要表示參數(shù)的 click.argument 和表示選項的 click.option 來裝飾。
程序結(jié)構(gòu)
程序結(jié)構(gòu)上:
- 實例化 Git 對象,供全局使用
- 定義 cli 函數(shù)作為命令組,也就是整個命令程序的入口
- 定義四個命令對應(yīng)的實現(xiàn)函數(shù) status、add、commit、push
則基本結(jié)構(gòu)如下:
import osimport clickfrom git.cmd import Gitgit = Git(os.getcwd())@click.group()def cli(): """ git 命令行 """ pass@cli.command()def status(): """ 處理 status 命令 """ pass@cli.command()@click.argument('pathspec', nargs=-1)def add(pathspec): """ 處理 add 命令 """ pass@cli.command()@click.option('-m', 'msg')def commit(msg): """ 處理 -m 命令 """ pass@cli.command()def push(): """ 處理 push 命令 """ passif __name__ == '__main__': cli()下面我們將一步步地實現(xiàn)我們的 git 程序。
五、實現(xiàn)
假定我們在 click-git.py 文件中實現(xiàn)我們的 git 程序。
5.1 status 子命令
status 子命令不接受任何參數(shù)和選項,因此其實現(xiàn)函數(shù)只需 cli.command() 裝飾。
@cli.command()def status(): """ 處理 status 命令 """ cmd = ['git', 'status'] output = git.execute(cmd) click.echo(output)不難看出,我們最后調(diào)用了真正的 git status 來實現(xiàn),并打印了輸出。
5.2 add 子命令
add 子命令相對于 status 子命令,需要接受任意個 pathspec 參數(shù),因此增加一個 click.argument 裝飾器,并且在 add 函數(shù)中需要增加同名的 pathspec 入?yún)ⅰ=?jīng) click 處理后的 pathspec 其實是個元組,和列表相加前,需要先轉(zhuǎn)換為列表。
@cli.command()@click.argument('pathspec', nargs=-1)def add(pathspec): """ 處理 add 命令 """ cmd = ['git', 'add'] + list(pathspec) output = git.execute(cmd) click.echo(output)當我們執(zhí)行 python3 click-git.py add --help 時,結(jié)果如下:
Usage: click-git.py add [OPTIONS] [PATHSPEC]... 處理 add 命令Options: --help Show this message and exit.既然 git add 能接受任意多個 pathspec,那么 add(pathspec) 的參數(shù)其實改為復(fù)數(shù)形式更為合適,但我們又希望幫助信息中是單數(shù)形式,這就需要額外指定 metavar,則有:
@cli.command()@click.argument('pathspecs', nargs=-1, metavar='[PATHSPEC]...')def add(pathspecs): """ 處理 add 命令 """ cmd = ['git', 'add'] + list(pathspecs) output = git.execute(cmd) click.echo(output)5.3 commit 子命令
add 子命令相對于 status 子命令,需要接受 -m 選項,因此增加一個 click.option 裝飾器,指定選項名稱 msg,并且在 commit 函數(shù)中增加同名入?yún)ⅰ?/p>@cli.command()@click.option('-m', 'msg')def commit(msg): """ 處理 -m 命令 """ cmd = ['git', 'commit', '-m', msg] output = git.execute(cmd) click.echo(output)
5.4 push 子命令
push 子命令同 status 子命令一樣,不接受任何參數(shù)和選項,因此其實現(xiàn)函數(shù)只需 cli.command() 裝飾。
@cli.command()def push(): """ 處理 push 命令 """ cmd = ['git', 'push'] output = git.execute(cmd) click.echo(output)至此,我們就實現(xiàn)了一個簡單的 git 命令行,使用 python click-git.py status 便可查詢項目狀態(tài)。
非常方便的是,每個命令函數(shù)的 docstring 都將作為這個命令的幫助信息,因此,當我們執(zhí)行 python3 click-git.py --help 會自動生成如下幫助內(nèi)容:
Usage: click-git.py [OPTIONS] COMMAND [ARGS]... git 命令行Options: --help Show this message and exit.Commands: add 處理 add 命令 commit 處理 -m 命令 push 處理 push 命令 status 處理 status 命令想看整個源碼,請戳 click-git.py 。
六、小結(jié)
本文簡單介紹了日常工作中常用的 git 命令,然后提出實現(xiàn)它的思路,最終一步步地使用 click 和 gitpython 實現(xiàn)了 git 程序。
對比 argparse 和 click 的實現(xiàn)版本,你會發(fā)現(xiàn)使用 click 來實現(xiàn)變得特定簡單:
- 相較于 argparse,子解析器、參數(shù)類型什么的統(tǒng)統(tǒng)不需要關(guān)心
- 相較于 docopt,參數(shù)解析和命令調(diào)用處理也不需要關(guān)心
這無疑是 click 最大的優(yōu)勢了。
關(guān)于 click 的講解將告一段落,回顧下 click 的至簡之道,你會愛上它。
現(xiàn)在,你已學(xué)會了三個命令行解析庫的使用了。但你以為這就夠了嗎?click 已經(jīng)夠簡單了吧,夠直接了吧?但它仍然不是最簡單的。
在下篇文章中,將為大家介紹一個由谷歌出品的在 Python 界很火的命令行庫 —— fire。
『講解開源項目系列』——讓對開源項目感興趣的人不再畏懼、讓開源項目的發(fā)起者不再孤單。跟著我們的文章,你會發(fā)現(xiàn)編程的樂趣、使用和發(fā)現(xiàn)參與開源項目如此簡單。歡迎留言聯(lián)系我們、加入我們,讓更多人愛上開源、貢獻開源~
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的git add后取消_Python 命令行之旅:使用 click 实现 git 命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python做数据库管理系统_pytho
- 下一篇: python常见内置函数_python常