在上一節中我們已經介紹了兩種方式來擴展 git bash 命令,解決了一般性命令不足的問題,最後我們還留下了一個疑問,如果兩種方式均無法擴展某些命令又該怎麼辦?
再介紹最後一個大招之前,我們首先來回憶一下前面兩種擴展方式.
git bash 命令行終端和 windows 系統自帶的 cmd 命令行終端互為補充,某些 git bash 命令沒有並不意味著 cmd也沒有,所以遇到 git bash 無某些命令的情況下,首先應該去看看 cmd 有沒有這個命令.
如果碰巧 cmd 存在該命令,那麼既可以在 cmd 中直接運行該命令,也可以在 git bash 中藉助 winpty+cmd原生命令 方式調用該命令.
示例:
F:\workspace\git-bash-extend>tree
卷 常用 的文件夾 PATH 列表
卷序列號為 62AE-62CA
F:.
├─extend-cmd
├─extend-gitforwindows-sdk
└─extend-gnuwin
cmd 命令行中有 tree 命令,不過該命令的後綴名是 .com 而不是 .exe.
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-extend
$ winpty tree.com
卷 常用 的文件夾 PATH 列表
卷序列號為 62AE-62CA
F:.
├─extend-cmd
├─extend-gitforwindows-sdk
└─extend-gnuwin
git bash 命令行中沒有 tree 命令,通過調用 cmd 命令行中的 tree.com 命令變相支持 tree 命令.
如果 git bash 命令行中沒有的命令, cmd 也沒有的話,那麼應該想辦法擴展 git bash 命令,最簡單的方式是找同源的命令.
正所謂"物以類聚人以群分",如果有現成的命令可以直接擴展過來,豈不是很方便,幸運的是, gnuwin 開源項目適用於 git!
我們可以從 gnuwin32 項目下載所需的擴展命令並複製到 git bash 的安裝位置下面的 /usr/bin 目錄下即可輕鬆擴展更多命令.
示例:
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-extend
$ tree
.
├── extend-cmd
│ └── cmd.md
├── extend-gitforwindows-sdk
│ └── gitforwindows-sdk.md
└── extend-gnuwin
└── gnuwin.md
3 directories, 3 files
輕鬆擴展的 tree 命令,功能更強大更像 linux 系統的 tree 命令.
回顧問題如果沒有第三方現成的命令文件供我們輕鬆擴展,意味著前面兩種方式均已失效!
如果真的遇到這種情況,一般會有兩種方式來解決問題.
直接放棄,尋找新的替代方案
定製開發,創造自定義解決方案
兩種方案沒有誰對誰錯,應該根據自身情況選擇適合自己的哪一種,針對 git bash 命令不足的問題,我們具體分析一下是否可行.
直接放棄,另尋新歡如果選擇方案一,意味著我們需要放棄 git bash 命令行工具並尋求新的替代方案,也就是說我們首先需要弄清楚兩個問題.
GitBash 是命令行工具,是為了使用 git 而默認提供的命令行工具,與此同時, GitBash 還有一個雙胞胎兄弟叫做 GitGUI 圖形化工具.
由此可見, GitBash 並不是 Git 的關鍵核心,可有可無的工具類而已.
既然已經決定放棄了 git bash 命令行,那麼我們就要找一個功能更加強大的命令行工具來替代 git bash.
但是, windows 始終是 windows ,是不可能真正變成 linux 系統的,所以我們要尋找的第三方工具充其量也是一種模擬系統而已.
市面上, windows 的命令行工具有很多,有些是單純的命令行工具有的是虛擬系統工具,但是不管怎麼樣,我們這一次要選擇的命令行工具一定要滿足以下幾點.
根據以上幾點,推薦一款 Babun 工具,正如官方標語宣傳的那樣,一款一會愛上的 WindowsShell .
Babun : a Windows shell you will love!
當然除了上述基本要求外,再談一談為什麼推薦這一款軟體?
安裝簡單,下載安裝包執行安裝腳本自動安裝配置.
自帶包管理工具,且靜默安裝無需過多交互式詢問.
基於 Cygwin 預配置大量常用插件,包括 git 和 shell.
默認終端模擬器是 Mintty,支持兩種類型的 shell,分別是 bash 和 zsh.
翻譯成人話就是: Babun 和 GitBash 一脈相承,不僅是親戚還是近親, Babun 比 GitBash 體積更大,功能更強.
babun 初體驗下載 babun 並解壓縮,然後雙擊 install.bat 腳本進行自動化安裝.
自動安裝成功後會自動創建桌面快捷方式並輸出 babun 基本信息.
配置你的新歡默認已經集成 git ,因此我們可以像 git bash 那樣使用 git.
{ ~ } » git --version ~
git version 2.1.4
接下來進行一些關於 git 的常規配置,徹底擁抱 babun.
# 添加用戶名和郵箱
git config --global user.name "your name"
git config --global user.email "your@email.com"
# gitalias 插件提供的 git 別名配置項
gitalias['alias.cp']='cherry-pick'
gitalias['alias.st']='status -sb'
gitalias['alias.cl']='clone'
gitalias['alias.ci']='commit'
gitalias['alias.co']='checkout'
gitalias['alias.br']='branch'
gitalias['alias.dc']='diff --cached'
gitalias['alias.lg']="log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %Cblue<%an>%Creset' --abbrev-commit --date=relative --all"
gitalias['alias.last']='log -1 --stat'
gitalias['alias.unstage']='reset HEAD --'
# 查看當前shell類型: zsh
{ ~ } » babun shell ~
/bin/zsh
# 切換當前shell類型: zsh -> bash
{ ~ } » babun shell /bin/bash ~
/bin/zsh
/bin/bash
命令行窗口內通過命令運行的配置命令一般都是臨時性的,下次電腦重啟或者新開命令行窗口就會失效,如果想要永久性生效,一般會將配置寫入到配置文件中, babun 也不例外,配置文件默認存放於 ~/.babunrc
# JVM options
export JAVA_OPTS="-Xms128m -Xmx256m"
# Modify these lines to set your locale
export LANG="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
# Uncomment these lines to the set your machine's default locale (and comment out the UTF-8 ones)
# export LANG=$(locale -uU)
# export LC_CTYPE=$(locale -uU)
# export LC_ALL=$(locale -uU)
# Uncomment this to disable daily auto-update & proxy checks on startup (not recommended!)
# export DISABLE_CHECK_ON_STARTUP="true"
# Uncomment to increase/decrease the check connection timeout
# export CHECK_TIMEOUT_IN_SECS=4
# Uncomment this lines to set up your proxy
# export http_proxy=http://user:password@server:port
# export https_proxy=$http_proxy
# export ftp_proxy=$http_proxy
# export no_proxy=localhost
如果當前用戶家目錄下沒有 .babunrc 配置文件,運行 touch~/.babunrc 自行創建該配置文件即可.
體驗新歡之美babun 看起來像是我們真的運行在 linux 系統一樣,那麼流暢順滑,是一款遇上再也不會錯過的 WindowsShell .
# tree 命令 babun 有
{ ~ } » tree ~
.
├── a
├── bin -> /home/vm-win7/.local/bin
└── will
1 directory, 2 files
# wget 命令 babun 也有
{ ~ } » wget www.baidu.com ~
--2019-05-24 14:33:01-- http://www.baidu.com/
Resolving www.baidu.com (www.baidu.com)... 115.239.211.112, 115.239.210.27
Connecting to www.baidu.com (www.baidu.com)|115.239.211.112|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://www.baidu.com/ [following]
--2019-05-24 14:33:02-- https://www.baidu.com/
Connecting to www.baidu.com (www.baidu.com)|115.239.211.112|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: 『index.html』
index.html [ <=> ] 152.70K --.-KB/s in 0.05s
2019-05-24 14:33:02 (2.98 MB/s) - 『index.html』 saved [156365]
不論是 tree 命令還是 wget 命令, babun 默認全部集成,這下真的要徹底替代 cmd 了呢!
但是,不知道你是否注意到在推薦 babun 時,我們曾經說過 babun 和 git bash 不僅是親戚而且還是近親.
這句話又從何談起?
首先, babun 是基於 Cygwin, git bash 或者說 gitforwindows 也是基於 Cygwin,兩者一脈相承. 再者, babun 支持 shell 和 zsh 兩種 shell,而 gitforwindows 僅支持 bash. 還有, babun 和 gitforwindows 的默認終端都是 mintty 模擬器.
最後一點是差異性比較大的, babun 是直接基於 Cygwin 而 gitforwindows 則是間接基於 Cygwin ,兩者確實存在一定的差異性!
再問最後一個問題,我們為什麼要使用 Cygwin 而拋棄 git bash ?
那是因為 git bash 默認提供的命令有限卻又沒有提供相應的包管理工具,導致我們無法自定義擴展更多命令.
所以,我們何不試一試 babun 的包管理工具呢?
{ ~ } » pact --help ~
pact: Installs and removes Cygwin packages.
Usage:
"pact install <package names>" to install given packages
"pact remove <package names>" to remove given packages
"pact update <package names>" to update given packages
"pact show" to show installed packages
"pact find <patterns>" to find packages matching patterns
"pact describe <patterns>" to describe packages matching patterns
"pact packageof <commands or files>" to locate parent packages
"pact invalidate" to invalidate pact caches (setup.ini, etc.)
Options:
--mirror, -m <url> : set mirror
--invalidate, -i : invalidates pact caches (setup.ini, etc.)
--force, -f : force the execution
--help
--version
{ ~ } » pact install arj ~ 2
Working directory is /setup
Mirror is http://mirrors.kernel.org/sourceware/cygwin/
--2019-05-24 14:26:46-- http://mirrors.kernel.org/sourceware/cygwin//x86/setup.bz2
Resolving mirrors.kernel.org (mirrors.kernel.org)... 198.145.21.9, 2001:19d0:306:6:0:1994:3:14
Connecting to mirrors.kernel.org (mirrors.kernel.org)|198.145.21.9|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3893609 (3.7M) [application/x-bzip2]
Saving to: 『setup.bz2』
setup.bz2 100%[====================================>] 3.71M 5.89KB/s in 4m 5s
2019-05-24 14:30:51 (15.5 KB/s) - 『setup.bz2』 saved [3893609/3893609]
Updated setup.ini
Installing arj
Found package arj
--2019-05-24 14:30:52-- http://mirrors.kernel.org/sourceware/cygwin//x86/release/arj/arj-3.10.22-3.tar.xz
Resolving mirrors.kernel.org (mirrors.kernel.org)... 198.145.21.9, 2001:19d0:306:6:0:1994:3:14
Connecting to mirrors.kernel.org (mirrors.kernel.org)|198.145.21.9|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 134244 (131K) [application/x-xz]
Saving to: 『arj-3.10.22-3.tar.xz』
arj-3.10.22-3.tar.xz 100%[====================================>] 131.10K 5.02KB/s in 17s
2019-05-24 14:31:10 (7.61 KB/s) - 『arj-3.10.22-3.tar.xz』 saved [134244/134244]
Unpacking...
Package arj requires the following packages, installing:
cygwin
Package cygwin is already installed, skipping
Package arj installed
{ ~ } » pact remove arj ~
Removing arj
Package arj removed
babun 在手, linux 我有!媽媽再也不用擔心我的 WindowsShell 不好用了!
忠貞不二,開發擴展方案一讓我們另尋新歡,方案二讓我們堅持己見,面對問題不逃避而是想辦法解決.
再一次回憶一下需要解決的問題: git bash 命令行默認沒有提供包管理工具以至於我們只能使用已集成的命令,所以不支持自定義擴展命令.
解鈴還須繫鈴人git bash 是 git 的命令行工具,而 git 原來僅僅支持 linux 系統,後來又支持了 windows ,值得注意的是,這種所謂的支持並不是原生支持,而是變相支持.
如果你打開 git 的官網 https://git-scm.com/download,你會發現 git 也是跨平臺的呢,竟然支持 mac , windows 和 linux 三大主流作業系統!
然而,真相卻不是這樣的, windows 平臺的 git 其實不是真正的 git,或者說 windows 和另外兩個並不是一家人.
首先看一下 MacOS X 的下載頁面介紹,請注意源碼地址: https://github.com/git/git/
源碼託管於 github,是 git 組織下面的 git 項目,其項目地址是 https://github.com/git/git/
接下來我們再看一下 LinuxandUnix 的下載頁面,雖然下載頁面推薦我們使用包管理工具進行安裝,但仍然給我提供了源碼地址: https://www.kernel.org/pub/software/scm/git/
雖然源碼下載地址不是 github,但是我們卻可以從項目地址中窺見一斑,仍然屬於 scm/git/ 項目,也是親兒子.
如果 mac 和 linux 是 git 原生支持的親兒子,那麼 windows 則是變相支持的乾兒子.
windows 和 mac 一樣,源碼同樣託管在 github,但是地址卻不一樣!項目地址: https://github.com/git-for-windows/git
這下局面瞬間清楚了, gitforwindows 並不是 git 原生支持的 windows 版本,或者說 windows 系統的 git 是另外一個團隊開發的,這個開發團隊就是 gitforwindows.
何不試試開發版Git SCM for Windows官網提供兩種版本,一個就是平時使用的發布版本,另一個就是開發版本.
既然發布版本沒有提供包管理工具,自然我們只能尋求開發版本的幫助.
跳轉到開發版本的下載地址 https://github.com/git-for-windows/build-extra/releases/tag/git-sdk-1.0.7,下載適合自己系統的版本.
雙擊 git-sdk-installer-1.0.7-64.7z.exe 進行自動安裝,安裝時間相當長,沒有一兩個小時也得有小上午時間,安裝期間可以接著做其他事情.
安裝完畢後可以進行自我測試,驗證開發板是否比發布版更大更強.
小試牛刀,應有盡有, tree 和 wget 等命令全都有!
千呼萬喚始出來gitforwindows 主要是由 msys2 和 mingw 等眾多組件二次開發而來的 windows 版本的 git.
msys2 和 mingw 都是一種在 windows 系統上打造 linux 運行體驗的解決方案,其中 msys2 是在 msys 基礎上重構開發的項目,而 msys2 項目默認提供有包管理工具 Pacman.
因此, gitforwindows 也可以使用 Pacman 包管理工具進行依賴安裝.
如需查看官方解釋請查看 : https://github.com/git-for-windows/build-extra
現代軟體開發需要一種管理依賴關係的方式,即跟蹤所需的軟體庫及其版本.
例如,適用於 Linux的 apt-get 或者 yum,適用於 MacOSX 的 homebrew,適用於 windows 的某些第三方工具.
GitforWindows 基於 MSYS2,它捆綁了 ArchLinux 的 Pacman 工具,因此接下來我們的包管理工具就是 Pacman.
如需在命令行中查看幫助文檔,支持 manPacman 和 Pacman--help 兩種方式.
$ Pacman --help
用法: Pacman <操作> [...]
操作:
Pacman {-h --help}
Pacman {-V --version}
Pacman {-D --database} <選項> <軟體包>
Pacman {-F --files} [選項] [軟體包]
Pacman {-Q --query} [選項] [軟體包]
Pacman {-R --remove} [選項] <軟體包>
Pacman {-S --sync} [選項] [軟體包]
Pacman {-T --deptest} [選項] [軟體包]
Pacman {-U --upgrade} [選項] <文件>
使用 'Pacman {-h --help}' 及某個操作以查看可用選項
# 下載默認版本
pacman -S <package-name>
# 下載最新版本
pacman -Sy <package-name>
# 升級到最新版本
pacman -Syu <package-name>
# 全部升級到最新版本
pacman -Syu
# 刪除第三方包
pacman -R <package-name>
# 列出已安裝的第三方包
pacman -Q
# 列出第三方包的內容
pacman -Ql <package-name>
# 查明文件屬於哪一個包
pacman -Qo <file-name>
輕鬆擴展 git bash 總結git bash 作為 windows 電腦上使用的 git 命令行工具,確實很方便,不僅支持 git 命令還支持常見的基本命令.
但 git bash 命令行並不能完全替代 cmd,是因為 windows 系統版本的 git 並不是真正的 git,而是由 gitforwindows 組織進行移植開發的特供版.
gitforwindows 項目借鑑了 msys2 和 mingw 等項目,旨在於打造類似於 linux 的運行環境,以便 git 所需的腳本命令能夠正常運行.
同時為了 git 服務的精簡, gitforwindows 的發布版移除了很多不必要的開發組件,其中就包括 msys2 的包管理工具 Pacman.
所以,平時使用的 git bash 由於沒有包安裝工具,所以不能輕鬆擴展更多命令,如果想要擴展更多命令,這裡提供了兩種思路.
一種思路是直接放棄,尋找新的替代方案,推薦的替代方案是 babun ,因為 babun 和 gitforwindows 血緣相近!
另一種思路就是源碼開發,不論是直接在源碼工具運行還是再次打包重新編譯成發布版都可以擴展更多自定義命令,不過開發版的要求更高,需要了解 msys2 和 mingw 等諸多概念,這裡就不再贅述了.
實際使用 git 的過程中,如果真的遇到了需要擴展更多命令的情況,請參考方法一,方法二和方法三依次嘗試,因為難度係數逐步加大,找到適合自己的解決方案才是好方案.
最後,感謝大家的閱讀,如果覺得本文對你有所幫助或者你有別的想法,歡迎留言評論告訴我,謝謝!
本文作者:雪之夢技術驛站,你在網際網路的路上匆匆而來,雪之夢技術驛站助你滿載而去。
聲明:本文為 腳本之家專欄作者 投稿,未經允許請勿轉載。
長按掃碼讚賞我