三招教你轻松扩展 git bash 命令(中)(一)

简介: 在上一篇文章中我们介绍了第一种方式实现轻松扩展 GitBash 命令,首先简单回顾一下主要知识.GitBash 命令行工具是 Windows 电脑安装 Git 时默认集成的终端工具,与此同时还有双胞胎兄弟 GitGUI 图形化工具.

前情回顾

上一篇文章中我们介绍了第一种方式实现轻松扩展 GitBash 命令,首先简单回顾一下主要知识.

GitBash 命令行工具是 Windows 电脑安装 Git 时默认集成的终端工具,与此同时还有双胞胎兄弟 GitGUI 图形化工具.


66.jpg

GitBash 是终端工具,而 Windows 系统默认也有个 cmd 终端工具,这两个命令行其实都可以运行 Git 相关命令,二者在这方面差异不大,使用哪一个都可以.

但是如果你更熟悉 linux 命令行语法的话,那么肯定建议选择 GitBash 命令行而不能是 cmd 命令行.

因为 windows 命令行语法和 linux 命令行语法差异还是比较大的.

当然, GitBashcmd 作为同类产品,两者并不是互斥的,而应该是互补产品,某些情况下, GitBash 可能还需要调用 cmd 才能完成相应任务呢!

比如说 GitBash 默认没有 tree 命令,而 cmd 命令行却又,所以我们可以在 GitBash 中调用 cmd 帮我们执行 tree 命令.


67.jpg

GitBash 调用 cmd 程序执行相关命令时,请一定要以 winpty 开头,不然可能会发生意想不到的结果.

问题背景

上一篇文章结尾处,我们留下了一个问题,那就是: 如果 cmd 也没有某些命令的话, GitBash 又该如何执行该命令?

正所谓"巧妇难为无米之炊", GitBash 命令行没有 wget 命令, cmd 命令行也没有 wget 命令,因此 GitBash 自然无法调用 wget 命令,那么解决思路就很清楚了:

扩展 wget 命令并让 GitBash 识别到 wget 命令文件呗!


68.png

还记得上篇文章GitBash 想要调用 cmdtree 命令,并不能直接 winpty tree 而是 winpty tree.com .

Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 直接输入 ` tree` 命令会提示找不到该命令文件
$ tree
bash: /usr/bin/tree: No such file or directory
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 输入 `tree.com` 命令则能调用该命令但会出现中文乱码
$ tree.com
▒▒ ▒▒▒▒ ▒▒▒ļ▒▒▒ PATH ▒б▒
▒▒▒▒▒к▒Ϊ 62AE-62CA
F:.
▒▒▒▒cmd
▒▒▒▒git-bash
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 直接输入 `winpty tree` 命令依旧找不到该命令
$ winpty tree
winpty: error: cannot start 'tree': Not found in PATH
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 输入 `winpty tree.com` 命令则正常调用该命令
$ winpty tree.com
卷 常用 的文件夹 PATH 列表
卷序列号为 62AE-62CA
F:.
├─cmd
└─git-bash

从上述的例子中,我们不难总结出以下结论:

  • GitBash 无法识别 .com 后缀结尾的命令文件.
  • GitBash 调用 cmd 命令时应通过 winpty 包装器.
  • GitBash 查找命令文件的路径也是通过 PATH 环境变量设置的,只不过还有自己的命令文件路径.

探寻庐山真面目

GitBash 命令行语法不仅和 linux 语法一致,而且设计思想基本也差不多,我们知道在 linux 中有一句话可以概括整个系统核心: 一切皆文件

那么 GitBash 所支持的各种命令自然也是文件,只要找到了命令文件自然也就明白为什么不支持 tree 命令了,换句话说,下一步我们就知道如何才能支持 tree 命令.

在桌面上找到 GitBash 图标的快捷方式,选中该图标右键,然后选择打开文件位置,现在应该进入到 Git 的安装目录了.


69.jpg

接下来,进入 usr/bin 目录,你会发现所有可执行的命令文件,但是并找不到 tree.exe 文件,所以自然无法执行 tree 命令.


70.jpg


那么如果我们能够找到 tree.exe 文件并将该命令文件放到 usr/bin 目录下自然就能够正常调用 tree 命令了,但是我们又该去哪里找 tree.exe 文件呢?

轻松扩展 git bash 命令(中)

tree.exe 命令文件千千万,但是适合 GitBash 命令行运行的却并不是全部文件.

想要对症下药,自然要先弄清楚 GitBash 到底属于何门何派,应用了哪些技术栈,这样才能知己知彼,轻松扩展更多命令.

Git 原来是 linux 系统专属软件,后来由 GitforWindows 组织进行了移植,所以现在 Git 才能够支持 Windows系统.

GitforWindows 在移植 Git 的过程中借鉴了大量的开源项目,包括 minGWmsys2 项目.



71.png


不查不知道,一查就发现了新大陆,原来想要把 linux 软件移植到 windows 平台的做法并不孤单,甚至提出了 WSL 概念!

WSL : WindowsSubsystemForLinux 的缩写,即为 linux 打造的 windows 子系统,可以简单理解为在 windows系统上获得 linux 系统的体验.

所以, GitBash 背后的技术支持来源于 minGWmsys2WSL 项目.

既然, GitBash 默认没有提供 tree 命令文件,那我们就自己动手去扩展 tree 命令.

由于暂时没有找到 minGW 已编译好的可执行文件,所以只能找其他 WSL 项目进行移植,亲测可行!

GnuWin 项目源码托管地址,其中 GnuWin64 是 64 位操作系统, GnuWin32 是 32 位操作系统,不过 GnuWin64 仍在开发计划中,所以我们只能使用 GnuWin32 .

GnuWin64 : https://sourceforge.net/projects/gnuwin64/

GnuWin32 : https://sourceforge.net/projects/gnuwin32/



72.jpg


依次选择 Files>tree>1.5.2.2 便可以找到 tree 命令文件,这里提供了各种文件类型,既有源码文件又要安装文件,还有可执行的二进制文件.

73.jpg

tree-1.5.2.2-bin.zip 下载地址: https://sourceforge.net/projects/gnuwin32/files/tree/1.5.2.2/tree-1.5.2.2-bin.zip/download

二进制文件

接下来的事情就比较简单了,将二进制文件 tree-1.5.2.2-bin.zip 解压,找到 tree.exe 文件并复制到 Git的安装目录下面的 usr/bin 目录中即可支持 tree 命令.

Administrator@snowdreams1006 MINGW64 /f/Downloads/tree-1.5.2.2-bin
# 解压 `tree-1.5.2.2-bin.zip` 文件,查看文件目录,`tree.exe` 位于 `bin` 目录下.
$ winpty tree.com
卷 常用 的文件夹 PATH 列表
卷序列号为 62AE-62CA
F:.
├─bin
├─contrib
│ └─tree
│ └─1.5.2.2
│ ├─tree-1.5.2.2
│ └─tree-1.5.2.2-src
├─man
│ └─cat1
└─manifest


74.jpg

现在再次测试 tree 命令来一起见证奇迹吧!

Administrator@snowdreams1006 MINGW64 /f/Downloads/tree-1.5.2.2-bin
# `tree` 命令等价于 `tree.exe` 命令,执行的正是我们刚刚扩展的 `tree-1.5.2.2-bin.zip` 二进制文件
$ tree
.
├── bin
│   └── tree.exe
├── contrib
│   └── tree
│   └── 1.5.2.2
│   ├── tree-1.5.2.2
│   ├── tree-1.5.2.2-GnuWin32.README
│   └── tree-1.5.2.2-src
│   ├── CHANGES
│   ├── INSTALL
│   ├── LICENSE
│   └── README
├── man
│   └── cat1
│   └── tree.1.txt
└── manifest
├── tree-1.5.2.2-bin.mft
└── tree-1.5.2.2-bin.ver
9 directories, 9 files

GitBash 扩展的 tree 命令的后缀名是 .exe ,而刚好能够识别,因此不必输入 tree.exe 命令.

相关文章
|
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 "Commit message"`)、拉取 (`git pull`) 和推送 (`git push`) 等。此外,还分享了高级技巧,如撤销提交 (`git revert <commit>`)、交互式暂存 (`git add -i`) 和使用别名简化命令 (`git config --global alias.ci commit`) 等,帮助开发者提升效率。无论是初学者还是资深开发者,都能从中受益。