三招教你轻松扩展 git bash 命令(下)(二)

简介: 在上一节中我们已经介绍了两种方式来扩展 git bash 命令,解决了一般性命令不足的问题,最后我们还留下了一个疑问,如果两种方式均无法扩展某些命令又该怎么办? 再介绍最后一个大招之前,我们首先来回忆一下前面两种扩展方式.

体验新欢之美

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-2414: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...302Found
Location: https://www.baidu.com/[following]
--2019-05-2414: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   in0.05s
2019-05-2414:33:02(2.98 MB/s)-‘index.html’ saved [156365]

不论是 tree 命令还是 wget 命令, babun 默认全部集成,这下真的要彻底替代 cmd 了呢!

但是,不知道你是否注意到在推荐 babun 时,我们曾经说过 babungit bash 不仅是亲戚而且还是近亲.

这句话又从何谈起?

首先, babun 是基于 Cygwin, git bash 或者说 gitforwindows 也是基于 Cygwin,两者一脉相承. 再者, babun 支持 shellzsh 两种 shell,而 gitforwindows 仅支持 bash. 还有, babungitforwindows 的默认终端都是 mintty 模拟器.

最后一点是差异性比较大的, babun 是直接基于 Cygwingitforwindows 则是间接基于 Cygwin ,两者确实存在一定的差异性!

再问最后一个问题,我们为什么要使用 Cygwin 而抛弃 git bash ?

那是因为 git bash 默认提供的命令有限却又没有提供相应的包管理工具,导致我们无法自定义扩展更多命令.

所以,我们何不试一试 babun 的包管理工具呢?

  • 包管理工具帮助文档
1. {~}» pact --help                                                                            ~
2. pact:Installs and removes Cygwin packages.
3. Usage:
4. "pact install <package names>" to install given packages
5. "pact remove <package names>" to remove given packages
6. "pact update <package names>" to update given packages
7. "pact show" to show installed packages
8. "pact find <patterns>" to find packages matching patterns
9. "pact describe <patterns>" to describe packages matching patterns
10. "pact packageof <commands or files>" to locate parent packages
11. "pact invalidate" to invalidate pact caches (setup.ini, etc.)
12. Options:
13. --mirror,-m <url>:set mirror
14. --invalidate,-i       : invalidates pact caches (setup.ini, etc.)
15. --force,-f : force the execution
16. --help
17. --version
• 安装第三方命令
18. {~}» pact install arj                                                                     ~2
19. Working directory is /setup
20. Mirror is http://mirrors.kernel.org/sourceware/cygwin/
21. --2019-05-2414:26:46--  http://mirrors.kernel.org/sourceware/cygwin//x86/setup.bz2
22. Resolving mirrors.kernel.org (mirrors.kernel.org)...198.145.21.9,2001:19d0:306:6:0:1994:3:14
23. Connecting to mirrors.kernel.org (mirrors.kernel.org)|198.145.21.9|:80... connected.
24. HTTP request sent, awaiting response...200 OK
25. Length:3893609(3.7M)[application/x-bzip2]
26. Saving to:‘setup.bz2’
27. setup.bz2                100%[====================================>]3.71M5.89KB/s   in4m5s
28. 2019-05-2414:30:51(15.5 KB/s)-‘setup.bz2’ saved [3893609/3893609]
29. Updated setup.ini
30. Installing arj
31. Found package arj
32. --2019-05-2414:30:52--  http://mirrors.kernel.org/sourceware/cygwin//x86/release/arj/arj-3.10.22-3.tar.xz
33. Resolving mirrors.kernel.org (mirrors.kernel.org)...198.145.21.9,2001:19d0:306:6:0:1994:3:14
34. Connecting to mirrors.kernel.org (mirrors.kernel.org)|198.145.21.9|:80... connected.
35. HTTP request sent, awaiting response...200 OK
36. Length:134244(131K)[application/x-xz]
37. Saving to:‘arj-3.10.22-3.tar.xz’
38. arj-3.10.22-3.tar.xz     100%[====================================>]131.10K5.02KB/s   in17s
39. 2019-05-2414:31:10(7.61 KB/s)-‘arj-3.10.22-3.tar.xz’ saved [134244/134244]
40. Unpacking...
41. Package arj requires the following packages, installing:
42. cygwin
43. Package cygwin is already installed, skipping
44. Package arj installed
• 卸载第三方命令
45. {~}» pact remove arj                                                                        ~
46. Removing arj
47. Package arj removed

babun 在手, linux 我有!妈妈再也不用担心我的 WindowsShell 不好用了!

忠贞不二,开发扩展

方案一让我们另寻新欢,方案二让我们坚持己见,面对问题不逃避而是想办法解决.

再一次回忆一下需要解决的问题: git bash 命令行默认没有提供包管理工具以至于我们只能使用已集成的命令,所以不支持自定义扩展命令.

解铃还须系铃人

git bashgit 的命令行工具,而 git 原来仅仅支持 linux 系统,后来又支持了 windows ,值得注意的是,这种所谓的支持并不是原生支持,而是变相支持.

如果你打开 git 的官网 https://git-scm.com/download,你会发现 git 也是跨平台的呢,竟然支持 mac , windowslinux 三大主流操作系统!

然而,真相却不是这样的, windows 平台的 git 其实不是真正的 git,或者说 windows 和另外两个并不是一家人.

首先看一下 MacOS X 的下载页面介绍,请注意源码地址: https://github.com/git/git/



94.jpg


源码托管于 github,是 git 组织下面的 git 项目,其项目地址是 https://github.com/git/git/


95.jpg


接下来我们再看一下 LinuxandUnix 的下载页面,虽然下载页面推荐我们使用包管理工具进行安装,但仍然给我提供了源码地址: https://www.kernel.org/pub/software/scm/git/


96.jpg


虽然源码下载地址不是 github,但是我们却可以从项目地址中窥见一斑,仍然属于 scm/git/ 项目,也是亲儿子.



97.jpg


如果 maclinuxgit 原生支持的亲儿子,那么 windows 则是变相支持的干儿子.


98.jpg


windowsmac 一样,源码同样托管在 github,但是地址却不一样!项目地址: https://github.com/git-for-windows/git


99.jpg

这下局面瞬间清楚了, 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 进行自动安装,安装时间相当长,没有一两个小时也得有小上午时间,安装期间可以接着做其他事情.


  • 安装完毕后可以进行自我测试,验证开发板是否比发布版更大更强.


100.jpg


小试牛刀,应有尽有, treewget 等命令全都有!

千呼万唤始出来

gitforwindows 主要是由 msys2mingw 等众多组件二次开发而来的 windows 版本的 git.

msys2mingw 都是一种在 windows 系统上打造 linux 运行体验的解决方案,其中 msys2 是在 msys 基础上重构开发的项目,而 msys2 项目默认提供有包管理工具 Pacman.

因此, gitforwindows 也可以使用 Pacman包管理工具进行依赖安装.

如需查看官方解释请查看 : https://github.com/git-for-windows/build-extra

  • 什么是包管理工具

现代软件开发需要一种管理依赖关系的方式,即跟踪所需的软件库及其版本.

例如,适用于 Linuxapt-get 或者 yum,适用于 MacOSXhomebrew,适用于 windows 的某些第三方工具.

GitforWindows 基于 MSYS2,它捆绑了 ArchLinuxPacman 工具,因此接下来我们的包管理工具就是 Pacman.

  • 如何使用包管理工具

如需在命令行中查看帮助文档,支持 manPacmanPacman--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 项目借鉴了 msys2mingw 等项目,旨在于打造类似于 linux 的运行环境,以便 git 所需的脚本命令能够正常运行.

同时为了 git 服务的精简, gitforwindows 的发布版移除了很多不必要的开发组件,其中就包括 msys2 的包管理工具 Pacman.

所以,平时使用的 git bash 由于没有包安装工具,所以不能轻松扩展更多命令,如果想要扩展更多命令,这里提供了两种思路.

一种思路是直接放弃,寻找新的替代方案,推荐的替代方案是 babun ,因为 babungitforwindows 血缘相近!

另一种思路就是源码开发,不论是直接在源码工具运行还是再次打包重新编译成发布版都可以扩展更多自定义命令,不过开发版的要求更高,需要了解 msys2mingw 等诸多概念,这里就不再赘述了.

实际使用 git 的过程中,如果真的遇到了需要扩展更多命令的情况,请参考方法一,方法二和方法三依次尝试,因为难度系数逐步加大,找到适合自己的解决方案才是好方案.

最后,感谢大家的阅读,如果觉得本文对你有所帮助或者你有别的想法,欢迎留言评论告诉我,谢谢!

本文作者:雪之梦技术驿站,你在互联网的路上匆匆而来,雪之梦技术驿站助你满载而去。

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。


相关文章
|
3月前
|
存储 开发工具 git
|
5天前
|
缓存 Java Shell
[Git]入门及其常用命令
本文介绍了 Git 的基本概念和常用命令,包括配置、分支管理、日志查看、版本回退等。特别讲解了如何部分拉取代码、暂存代码、删除日志等特殊需求的操作。通过实例和图解,帮助读者更好地理解和使用 Git。文章强调了 Git 的细节和注意事项,适合初学者和有一定基础的开发者参考。
20 1
[Git]入门及其常用命令
|
3月前
|
开发工具 git
【GIT 第二篇章】GIT常用命令
Git常用命令涵盖初始化、状态管理、提交、分支处理、远程操作等关键流程。`git init`启动本地仓库,`git clone`下载远程仓库。通过`git status`和`git diff`检查工作状态与差异。利用`git add`暂存文件,`git commit`保存更改。借助`git branch`、`git checkout`、`git merge`和`git rebase`管理分支。使用`git fetch`、`git pull`和`git push`同步远程仓库。通过`git reset`、`git revert`和`git checkout`实现版本回退。
65 0
|
27天前
|
开发工具 git
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
这篇文章是关于Git常用命令的总结,包括初始化配置、基本提交、分支操作、合并、压缩历史、推送和拉取远程仓库等操作的详细说明。
96 1
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
|
8天前
|
开发工具 git 开发者
|
8天前
|
开发工具 git 开发者
提升Git效率:掌握这5个高级命令
【10月更文挑战第17天】
27 0
|
2月前
|
存储 Linux 开发工具
掌握 Git 命令:每个开发者的必备技能
无论团队项目还是个人开发,掌握 Git 命令都是必备技能。本文介绍 Git 的基本概念与命令,如初始化仓库 (`git init`)、添加文件 (`git add`)、提交更改 (`git commit`)、检出分支 (`git checkout`)、合并分支 (`git merge`) 等,还分享了高级技巧如查看差异 (`git diff`)、撤销提交 (`git revert`)、修复合并冲突 (`git mergetool`) 和使用别名简化命令 (`git config --global alias.ci commit`)。
|
2月前
|
机器学习/深度学习 Shell 开发工具
Python使用管道执行git命令报错|4-7
Python使用管道执行git命令报错|4-7
|
2月前
|
存储 Linux 开发工具
Git基础命令,分支,标签的使用【快速入门Git】
本文详细介绍了Git版本控制系统的基础概念和常用命令,包括工作区、暂存区和版本库的区别,文件状态的变化,以及如何进行文件的添加、提交、查看状态、重命名、删除、查看提交历史、远程仓库操作和分支管理,还涉及了Git标签的创建和删除,旨在帮助读者快速入门Git。
Git基础命令,分支,标签的使用【快速入门Git】
|
2月前
|
存储 Linux 开发工具
掌握 Git 命令:每个开发者的必备技能
本文介绍 Git 的核心概念,如仓库、提交、分支与合并,并提供了常用命令,如初始化仓库 (`git init`)、提交更改 (`git commit -m &quot;Commit message&quot;`)、拉取 (`git pull`) 和推送 (`git push`) 等。此外,还分享了高级技巧,如撤销提交 (`git revert &lt;commit&gt;`)、交互式暂存 (`git add -i`) 和使用别名简化命令 (`git config --global alias.ci commit`) 等,帮助开发者提升效率。无论是初学者还是资深开发者,都能从中受益。