Git
在三、四、五、六线城市以及像浪子所在的偏远小山村中想要直接使用浏览器访问 GitHub 是有问题的,输入网址后按下回车键,这个页面都不带刷新的,会直接出现 “无法访问该网站” 的错误。解决办法之一就是修改 hosts
文件,加速访问这个体验并不明显,只是可以访问,偶尔抽风是正常的。
- Windows 系统,该文件在
C:\Windows\System32\drivers\etc
目录下; - Linux 系统,则在
/etc/hosts
。
Windows 推荐火绒,修改 hosts 文件超级方便。建议先对 hosts 文件备份,修改错误后可以还原。
访问 IPAddress.com
,输入 github.com
回车查询。将获取到的 IP 与 Github 的域名写入到 hosts 文件中,例如:
1140.82.113.4 github.com
配置基本信息
{% folding 可选配置 open:false color:green %}
1# git 提交显示中文
2$ git config --global core.quotepath false
3$ git config --global i18n.commitencoding utf-8
4$ git config --global i18n.logoutputencoding utf-8
{% endfolding %}
1# 配置个人信息
2$ git config --global user.name "个人名称或昵称"
3$ git config --global user.email "邮箱"
4
5# 列出所有配置信息:
6$ git config --list / git config -l
7# 取消某一项全局配置
8$ git config --global --unset user.name
检入:提交,检出:下载
在 Git 执行配置的时候有一些选项:
--local
仅指定当前本地 git 仓库--global
指定所有当前用户的 git 仓库--system
指定当前系统的所有 git 仓库(很少使用)
配置多个平台 SSH
1. 生成Github用的SSH-Key
1# Linux Mac
2$ ssh-keygen -t ed25519 -C 'xxx@xx.com' -f ~/.ssh/github_id
3# Window
4$ ssh-keygen -t ed25519 -C 'xxx@xx.com' -f C:/Users/用户名/.ssh/github_id
2. 生成gitee使用的SSH-Key
1# Linux Mac
2$ ssh-keygen -t ed25519 -C 'xxx@xx.com' -f ~/.ssh/gitee_id
3# Window
4$ ssh-keygen -t ed25519 -C 'xxx@xx.com' -f C:/Users/用户名/.ssh/gitee_id
2022-08-22 修改为使用 ed25519 算法生成。
ssh-keygen 支持的部分选项说明:
选项 | 说明 |
---|---|
-b | 该选项指定密钥的位数。管理 SSH 用例的算法可能要求使用特定的密钥长度。一般来说,RSA 密钥使用 2048 位就足够了。 |
-t | 指定要创建的 key 的类型,常见的有 RSA、DSA、ECDSA 等 |
-f | 指定存储创建密钥的文件名。 |
-C | 描述密钥的作用/说明 |
3. 配置 config
config 中的配置说明:
1Host [git.domain.com]
2 HostName xxx.com
3 User [user]
4 Port [number]
5 PreferredAuthentications publickey
6 PasswordAuthentication no
7 IdentityFile ~/.ssh/[name_of_PRIVATE_key_file]
- 空行和以“#”开头的行是注释。
- 每行都以关键字开头,后跟参数。
- 配置选项可以用空格或可选空格分隔,并且正好是一个
=
。- 参数可以用双引号
"
括起来,以指定包含空格的参数。SSH 其它可选参数配置详见:https://www.ssh.com/academy/ssh/config
SSH 配置按照以下顺序读取文件:
- 从命令行指定的选项。
~/.ssh/config
中定义的选项(用户配置)。/etc/ssh/ssh_config
中定义的选项(全局配置)。
1# github1
2# Host 可以自己定义,在此文件中必须唯一,之后在 down 源码时需要使用这个自定义的 host
3Host github.com-repo1
4 # HostName 是代码托管平台的域名,例如:code.aliyun.com, github.com, gitee.com 等
5 HostName github.com
6 # 设认证方式:公钥
7 PreferredAuthentications publickey
8 # 指定公钥对应的私钥路径
9 IdentityFile ~/.ssh/github1_id
10
11# github2
12Host github.com-repo2
13 HostName github.com
14 PreferredAuthentications publickey
15 IdentityFile ~/.ssh/github2_id
16
17# gitee
18Host gitee.com
19 HostName gitee.com
20 PreferredAuthentications publickey
21 IdentityFile ~/.ssh/gitee_id
如果同一个平台配置了多个不同账号的SSH密钥,那么在进行 clone、remote 等操作时,地址需要做一些改变,否则会找不到而报错。在克隆时 git@github.com:user/repo.git
需要替换为对应的 Host
内容。
例如 clone github2 账户的某个仓库:
1git clone git@github.com-repo2.com:user/repo.git
4. 测试是否配置成功
1# 使用 ssh -T 进行测试,成功的话会打印 Hi,username……
2$ ssh -T git@gitee.com
3$ ssh -T git@github.com
4$ ssh -T git@github.com-repo1.com
5. Windows 下 Git Bash 的一些配置
Windows 中不论是 cmd 还是 Powershell,浪子都不是很喜欢用,而 Git Bash 使用起来非常不错,基本和 Linux 使用方式保持一致(路径除外,这是一个问题)。所以浪子的电脑一般都使用的是 Git Bash。Windows 中的 Git-Bash 如果想要用的舒服,还是需要额外的配置,这里补充几个配置。
5.1 tree
Win 中的默认的 tree 命令功能有限,远远达不到需求。所以我们需要额外安装一个,让它更好用!
下载tree的二进制文件
后解压,把 bin
目录下的 tree.exe
文件复制到 Git 安装目录 xxx/Git/usr/bin/
下即可。当然,直接解压后添加到环境变量也可以,这样 Windows 全局的终端都可以用,看个人喽!
1# 显示 num 层的目录
2tree -AL 2
3# 过滤某个文件夹(默认过滤子文件夹中的同名文件夹)
4tree -I "node_modules"
常用选项:
选项 | 说明 |
---|---|
-a | 显示所有文件夹 |
-A | 使用ASNI绘图字符显示树状图而非以ASCII字符组合。 |
-C | 目录添加颜色 |
-D | 显示修改时间 |
-i | 不以阶梯状列出文件或目录名称 |
-s | 显示文件大小 |
5.2 Git Bash 编码修改为 utf-8、设置别名
修改 Git 安装目录下的 /Git/etc/bash.bashrc
文件,在最后加入下面的内容,保存退出,重启 git-bash 即可。
1# 设置别名命令
2alias ll="ls -al"
3
4# git-bash 终端使用 utf-8 编码
5export LANG="zh_CN.UTF-8"
6export LC_ALL="zh_CN.UTF-8"
5.3 使用 Starship 美化 Git Bash
在 Starship 的 Release 页面下载最新版的
msi
安装程序进行安装(这会自动添加环境变量,绿色版安装需要自行添加)。下载安装一款你喜欢的 Nerd Font 字体,并在
C:\Users\yourname\.minttyrc
文件中配置以便在 Git Bash 可以更好的显示。注意: 这里只是修改原生的 Git Bash 字体。如果使用了其它的工具集成了 Git Bash(例如 windows terminal、vscode、idea 等),则此配置不会生效。需要在这些集成工具中自行配置,修改字体设置上面的三种工具都支持,非常简单,这里不再赘述。BASH1Font=JetBrainsMono Nerd Font
打开 Git 的配置文件:
xxx/Git/etc/bash.bashrc
,滑倒最后,添加以下内容:BASH1# Uncomment to use the terminal colours set in DIR_COLORS 2# eval "$(dircolors -b /etc/DIR_COLORS)" 3eval "$(starship init bash)"
重启 Git Bash 就可以看到默认效果啦!自定义样式可以参考 Starship 官方文档 ,如果是新手,可以在 社区分享 中寻找自己喜欢的主题。浪子这里放一个自己使用的 Starship 主题 。
- Nerd Font 字体是在原有字体的基础上上添加了一些图标、emoji 和一些额外的“扩展”,可以显示特殊字符以及一些 icon。
- Git Bash 没有根据输入 自动建议 的功能(参考 Starship 官网主页的建议效果图 ),这和使用的 bash 有关。想要同样的效果,请考虑使用 zsh、fish、oh my zsh 等其它支持的终端工具。
- VsCode(建议使用最新版) 使用 starship 美化了的 Git Bash 时,如果是 1.70.x ~ 1.90.0 版本,需要在 settings.json 中添加 “terminal.integrated.shellIntegration.enabled”: false, 禁用 vscode 自动注入的终端集成。如不设置,在 vscode 中打开终端和执行命令后都需要等待较长时间(vscode 会自动注入终端集成,搜索需要花费一定的时间)。
5.4 jq
Release
页面下载符合自己计算机架构的软件,以 Windows 为例,下载 jq-windows-amd64.exe 后改为 jq.exe
,同样放到 Git 安装目录的 /usr/bin
路径下。
5.5 yq
yq 不仅仅可以像 jq 一样美化 json 输出,而且还支持 json、yaml 格式互换等高级功能,支持多种操作系统。下载后改名为 yq 同样丢到 Git 安装目录的 /usr/bin
路径下。
5.6 nc(netcat)
这个 网站 下载,不过可能会被防病毒误杀,建议关闭 Windows 的防火墙。也可以去这个 GitHub 网站 下载。
之后和上面一样,把 nc.exe 文件丢到 Git 安装目录的 /usr/bin
路径下。
5.7 shellcheck
与上面的同理。
GPG
GPG 是什么、能干什么还是自己去查资料吧,浪子知道的不多,只知道可以用来 加密、签名,还是一种身份认证,Github 上通过 GPG 还可以点亮一个绿色的小图标,既然有身份验证的功能,自然也是可以代替 SSH 的,就是配置较为麻烦。GPG 还有什么联网、离线等许多概念,反正是很强的。浪子也还没搞明白,主要日常用的不多。。。
[Gitee] 上有篇文章专门写了如何配置 GPG 密钥,想要使用替代 SSH 的用户可以参考。
常用命令
1# 生成 gpg
2gpg --full-generate-key
3# 查看 gpg 公钥列表
4gpg --list-keys
5# 查看 gpg 私钥列表
6gpg --list-secret-keys
7# 删除 gpg
8gpg --delete-secret-keys [gpg_id]
9gpg --delete-keys [gpg_id]
10# 查看 gpg 的指纹
11gpg --fingerprint [gpg_id]
12
13# 生成撤销证书(会自动生成,在 ~/.gnupg/private-keys-v1.d 目录)
14gpg --gen-revoke -ao revoke.pgp [gpg_id]
子密钥拿出来单独说,因为下面的命令会进入 gpg bash 环境。
1# 生成子密钥,使用下面的命令会进入 gpg bash
2$ gpg --edit-key [gpg_id]
3# 添加子密钥,根据提示选择 sign only:仅用于签名,encrypt only:仅用于加密
4# 后面的操作和主密钥类似,略过
5gpg> addkey
6# 添加后使用 save 保存
7gpg> save
8# 查看列表
9gpg> list
10# 选择密钥
11gpg> key [num]
12# 吊销
13gpg> revkey
14
15# 如果要删除
16gpg> delkey
17
18gpg> save
- gpg –full-generate-key:一个更加详细的密钥生成选项,推荐生成时优先选择。它会提供更多的选项,例如选择密钥算法、设置密钥长度、过期时间等。虽然 GPG 本身支持生成多种算法密钥,但是平台不一定支持那么多,具体使用需要参照多方,总的来说 RSA 目前使用广泛。
- 日常中推荐使用子密钥,并生成一份对应的撤销证书。有了这个撤销凭证,可以在没有密码的情况下,将对应的公钥声明为失效。
另外,本文的 gpg_id 和其它文章的 keyid 等价,user_id 一般是生成 gpg 时的 name(Real name)或者邮箱,可以替换使用。例如上面的命令都是使用的 gpg_id,你也可以换为 user_id,都是一样的
有多种方式 获取 gpg_id,下面只是其中一种方式,也是最简单的方式。
1# 查看 gpg 列表
2$ gpg --list-keys
3[keyboxd]
4---------
5pub ed25519 2024-06-22 [SC]
6 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
7uid [ultimate] jhlz <jhlzlove@163.com>
8sub cv25519 2024-06-22 [E]
9...
上面的 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 就是 gpg_id。而 [ultimate] 后面的 jhlz 就是 user_id(如果生成时有 comment,后面会有括号,括号内显示备注)。比如下面的内容
1$ gpg -k
2[keyboxd]
3---------
4sec rsa4096 2023-09-13 [SC]
5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
6uid [ultimate] userid (适用于国内平台的GPG) <xxxxx@qq.com>
7ssb rsa4096 2023-09-13 [E]
加密
1# 加密文件
2gpg --encrypt [input_file] --output [output_filename] --recipient [gpg_id]
3# 上面的缩写
4gpg -e [input_file] -o [output_filename] -r [gpg_id]
5# 解密文件
6gpg --decrypt [input_file] --output [output_filename]
7
8# 导出 gpg 公钥
9gpg --armor --output [public_key.pem] --export [gpg_id]
10# 导出 gpg 私钥,如果有子私钥,需要最后加上 !,否则会直接导出所有子私钥
11gpg --armor --output [secret_key.pem] --export-secret-key [gpg_id]
12# 导出子私钥
13gpg --armor --output [subkey.pem] --export-secret-subkeys [gpg_id]!
14
15# 如果不需要导出到文件,直接在当前控制台输出
16gpg --armor --export [gpg_id]
armor 选项代表生成明文,默认生成二进制。–output 输出文件,–export 打印到控制台
签名
签名主要用来验证消息的发送人,确认该信息是否真的出自某人之手。
1# 文件签名
2gpg --sign [file]
3# 可以生成 ASCII 码的签名文件
4gpg --clearsign [file]
5# 签名和原文本分开(前两种的签名文件中包含了所有原文本,所以体积会比较大)
6gpg --armor --detach-sign [file]
7
8# 使用公钥验证签名
9gpg --verify [pub_key] [file]
使用他人的公钥加密信息
1# 导入他人 gpg 公钥文件
2gpg --import [file]
3# 查看 gpg 列表
4gpg -k
5
6# 验证导入的公钥,依旧是进入 gpg bash
7gpg --edit-key [gpg_id]
8# 查看指纹
9fpr
10# 如果指纹没有问题就通过
11sign
12# 保存
13save
举个小栗子
因为没有上传到服务器,所以就没有对应的 gpg 指纹。这里放了一个 gpg 公钥的内容。你可以复制公钥的内容,在自己的系统上创建一个文本并把以下内容复制进去,然后导入到你的系统中,通过指纹验证后(指纹就是非缩写的 gpg_id 四位为一组分开)就可以使用该公钥加密要发送给浪子的信息,或者是验证签名。
1-----BEGIN PGP PUBLIC KEY BLOCK-----
2
3mDMEZnZfURYJKwYBBAHaRw8BAQdA2A26MqlvEmdvxTijbzTz76U0EvB4l08f9kta
4/EyWPTC0F2pobHogPGpobHpsb3ZlQDE2My5jb20+iJMEExYKADsWIQQ5CChWQoQw
5B0in/+tXfpaIaD1lvQUCZnZfUQIbAwULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIX
6gAAKCRBXfpaIaD1lvQ9VAP0dedHC0bLAR32PFlwOv2sETeiTB6F8ZDUOebAW8XRv
7dQD/eRNvOYwZ/gvsB4ab1rnu2D/lg8cqQdGOAds0qEs4sgG4OARmdl9REgorBgEE
8AZdVAQUBAQdAC9QvugKU6B5QHMXCfRzop05iX2Jfm2vDpTjiSzFSJGwDAQgHiHgE
9GBYKACAWIQQ5CChWQoQwB0in/+tXfpaIaD1lvQUCZnZfUQIbDAAKCRBXfpaIaD1l
10vdYHAP95YfyXb4MfFg+oSclMBtvaca+nwHrfo3GZRsCHoq04ywEAvYIVv7uI648y
11hJlZoGD+0Jb7tWq1/iAJo0fsxg++igU=
12=eq5R
13-----END PGP PUBLIC KEY BLOCK-----
由于 GPG 可以由他人上传,例如我冒充胡歌上传了一个 GPG(这其实并不是他传的),这样其实也不好追溯 指纹不要随便公开,指纹是 Hash 值,存在 Hash 碰撞,那么就可以被伪造,不安全
如果 Github 中使用 GPG 代替 SSH(浪子不是很推荐,使用还很麻烦。。。),虽然这可以让你的 Github 提交多一个很有精神的图标,保证来自本人的提交。
1# -S 使用 GPG 验证提交,需要输入创建 GPG 的密码
2git commit -S -m "YOUR_COMMIT_MESSAGE"
3
4# 如果使用的是 czg
5czg gpg
评论