Git

在三、四、五、六线城市以及像浪子所在的偏远小山村中想要直接使用浏览器访问 GitHub 是有问题的,输入网址后按下回车键,这个页面都不带刷新的,会直接出现 “无法访问该网站” 的错误。解决办法之一就是修改 hosts 文件,加速访问这个体验并不明显,只是可以访问,偶尔抽风是正常的。

  • Windows 系统,该文件在 C:\Windows\System32\drivers\etc 目录下;
  • Linux 系统,则在 /etc/hosts

Windows 推荐火绒,修改 hosts 文件超级方便。建议先对 hosts 文件备份,修改错误后可以还原。

访问 IPAddress.com,输入 github.com 回车查询。将获取到的 IP 与 Github 的域名写入到 hosts 文件中,例如:

1
140.82.113.4 github.com

配置基本信息

可选配置

1
2
3
4
# git 提交显示中文
$ git config --global core.quotepath false
$ git config --global i18n.commitencoding utf-8
$ git config --global i18n.logoutputencoding utf-8
1
2
3
4
5
6
7
8
# 配置个人信息
$ git config --global user.name "个人名称或昵称"
$ git config --global user.email "邮箱"

# 列出所有配置信息:
$ git config --list / git config -l
# 取消某一项全局配置
$ git config --global --unset user.name

检入:提交,检出:下载

在 Git 执行配置的时候有一些选项:

--local 仅指定当前本地 git 仓库
--global 指定所有当前用户的 git 仓库
--system 指定当前系统的所有 git 仓库(很少使用)

配置多个平台 SSH

1. 生成Github用的SSH-Key

1
2
3
4
# Linux Mac
$ ssh-keygen -t ed25519 -C 'xxx@xx.com' -f ~/.ssh/github_id
# Window
$ ssh-keygen -t ed25519 -C 'xxx@xx.com' -f C:/Users/用户名/.ssh/github_id

2. 生成gitee使用的SSH-Key

1
2
3
4
# Linux Mac
$ ssh-keygen -t ed25519 -C 'xxx@xx.com' -f ~/.ssh/gitee_id
# Window
$ 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 中的配置说明:

1
2
3
4
5
6
7
Host [git.domain.com]
HostName xxx.com
User [user]
Port [number]
PreferredAuthentications publickey
PasswordAuthentication no
IdentityFile ~/.ssh/[name_of_PRIVATE_key_file]
  • 空行和以“#”开头的行是注释。
  • 每行都以关键字开头,后跟参数。
  • 配置选项可以用空格或可选空格分隔,并且正好是一个 =
  • 参数可以用双引号 " 括起来,以指定包含空格的参数。

SSH 其它可选参数配置详见:https://www.ssh.com/academy/ssh/config

SSH 配置按照以下顺序读取文件:

  • 从命令行指定的选项。
  • ~/.ssh/config 中定义的选项(用户配置)。
  • /etc/ssh/ssh_config 中定义的选项(全局配置)。
.ssh/config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# github1
# Host 可以自己定义,在此文件中必须唯一,之后在 down 源码时需要使用这个自定义的 host
Host github.com-repo1
# HostName 是代码托管平台的域名,例如:code.aliyun.com, github.com, gitee.com 等
HostName github.com
# 设认证方式:公钥
PreferredAuthentications publickey
# 指定公钥对应的私钥路径
IdentityFile ~/.ssh/github1_id

# github2
Host github.com-repo2
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github2_id

# gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee_id

如果同一个平台配置了多个不同账号的SSH密钥,那么在进行 clone、remote 等操作时,地址需要做一些改变,否则会找不到而报错。在克隆时 git@github.com:user/repo.git 需要替换为对应的 Host 内容。

例如 clone github2 账户的某个仓库:

1
git clone git@github.com-repo2.com:user/repo.git

4. 测试是否配置成功

1
2
3
4
# 使用 ssh -T 进行测试,成功的话会打印 Hi,username……
$ ssh -T git@gitee.com
$ ssh -T git@github.com
$ 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
2
3
4
# 显示 num 层的目录
tree -AL 2
# 过滤某个文件夹(默认过滤子文件夹中的同名文件夹)
tree -I "node_modules"

常用选项:

选项 说明
-a 显示所有文件夹
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
-C 目录添加颜色
-D 显示修改时间
-i 不以阶梯状列出文件或目录名称
-s 显示文件大小

5.2 Git Bash 编码修改为 utf-8、设置别名

修改 Git 安装目录下的 /Git/etc/bash.bashrc 文件,在最后加入下面的内容,保存退出,重启 git-bash 即可。

D:\xxx\Git\etc\bash.bashrc
1
2
3
4
5
6
# 设置别名命令
alias ll="ls -al"

# git-bash 终端使用 utf-8 编码
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"

5.3 使用 Starship 美化 Git Bash

  1. 在 Starship 的 Release 页面下载最新版的 msi 安装程序进行安装(这会自动添加环境变量,绿色版安装需要自行添加)。

  2. 下载安装一款你喜欢的 Nerd Font 字体,并在 C:\Users\yourname\.minttyrc 文件中配置以便在 Git Bash 可以更好的显示。注意: 这里只是修改原生的 Git Bash 字体。如果使用了其它的工具集成了 Git Bash(例如 windows terminal、vscode、idea 等),则此配置不会生效。需要在这些集成工具中自行配置,修改字体设置上面的三种工具都支持,非常简单,这里不再赘述。

    ~/.minttyrc
    1
    Font=JetBrainsMono Nerd Font
  3. 打开 Git 的配置文件:xxx/Git/etc/bash.bashrc,滑倒最后,添加以下内容:

    D:\xxx\Git\etc\bash.bashrc
    1
    2
    3
    # Uncomment to use the terminal colours set in DIR_COLORS
    # eval "$(dircolors -b /etc/DIR_COLORS)"
    eval "$(starship init bash)"
  4. 重启 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 路径下。

GPG

GPG 是什么、能干什么还是自己去查资料吧,浪子知道的不多,只知道可以用来 加密、签名,还是一种身份认证,Github 上通过 GPG 还可以点亮一个绿色的小图标,既然有身份验证的功能,自然也是可以代替 SSH 的,就是配置较为麻烦。GPG 还有什么联网、离线等许多概念,反正是很强的。浪子也还没搞明白,主要日常用的不多。。。

[Gitee] 上有篇文章专门写了如何配置 GPG 密钥,想要使用替代 SSH 的用户可以参考。

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 生成 gpg
gpg --full-generate-key
# 查看 gpg 公钥列表
gpg --list-keys
# 查看 gpg 私钥列表
gpg --list-secret-keys
# 删除 gpg
gpg --delete-secret-keys [gpg_id]
gpg --delete-keys [gpg_id]
# 查看 gpg 的指纹
gpg --fingerprint [gpg_id]

# 生成撤销证书(会自动生成,在 ~/.gnupg/private-keys-v1.d 目录)
gpg --gen-revoke -ao revoke.pgp [gpg_id]

子密钥拿出来单独说,因为下面的命令会进入 gpg bash 环境。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 生成子密钥,使用下面的命令会进入 gpg bash
$ gpg --edit-key [gpg_id]
# 添加子密钥,根据提示选择 sign only:仅用于签名,encrypt only:仅用于加密
# 后面的操作和主密钥类似,略过
gpg> addkey
# 添加后使用 save 保存
gpg> save
# 查看列表
gpg> list
# 选择密钥
gpg> key [num]
# 吊销
gpg> revkey

# 如果要删除
gpg> delkey

gpg> save
  • gpg --full-generate-key:一个更加详细的密钥生成选项,推荐生成时优先选择。它会提供更多的选项,例如选择密钥算法、设置密钥长度、过期时间等。虽然 GPG 本身支持生成多种算法密钥,但是平台不一定支持那么多,具体使用需要参照多方,总的来说 RSA 目前使用广泛。
  • 日常中推荐使用子密钥,并生成一份对应的撤销证书。有了这个撤销凭证,可以在没有密码的情况下,将对应的公钥声明为失效。

另外,本文的 gpg_id 和其它文章的 keyid 等价,user_id 一般是生成 gpg 时的 name(Real name)或者邮箱,可以替换使用。例如上面的命令都是使用的 gpg_id,你也可以换为 user_id,都是一样的

有多种方式 获取 gpg_id,下面只是其中一种方式,也是最简单的方式。

1
2
3
4
5
6
7
8
9
# 查看 gpg 列表
$ gpg --list-keys
[keyboxd]
---------
pub ed25519 2024-06-22 [SC]
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
uid [ultimate] jhlz <jhlzlove@163.com>
sub cv25519 2024-06-22 [E]
...

上面的 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 就是 gpg_id。而 [ultimate] 后面的 jhlz 就是 user_id(如果生成时有 comment,后面会有括号,括号内显示备注)。比如下面的内容

1
2
3
4
5
6
7
$ gpg -k
[keyboxd]
---------
sec rsa4096 2023-09-13 [SC]
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
uid [ultimate] userid (适用于国内平台的GPG) <xxxxx@qq.com>
ssb rsa4096 2023-09-13 [E]

加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 加密文件
gpg --encrypt [input_file] --output [output_filename] --recipient [gpg_id]
# 上面的缩写
gpg -e [input_file] -o [output_filename] -r [gpg_id]
# 解密文件
gpg --decrypt [input_file] --output [output_filename]

# 导出 gpg 公钥
gpg --armor --output [public_key.pem] --export [gpg_id]
# 导出 gpg 私钥,如果有子私钥,需要最后加上 !,否则会直接导出所有子私钥
gpg --armor --output [secret_key.pem] --export-secret-key [gpg_id]
# 导出子私钥
gpg --armor --output [subkey.pem] --export-secret-subkeys [gpg_id]!

# 如果不需要导出到文件,直接在当前控制台输出
gpg --armor --export [gpg_id]

armor 选项代表生成明文,默认生成二进制。–output 输出文件,–export 打印到控制台

签名

签名主要用来验证消息的发送人,确认该信息是否真的出自某人之手。

1
2
3
4
5
6
7
8
9
# 文件签名
gpg --sign [file]
# 可以生成 ASCII 码的签名文件
gpg --clearsign [file]
# 签名和原文本分开(前两种的签名文件中包含了所有原文本,所以体积会比较大)
gpg --armor --detach-sign [file]

# 使用公钥验证签名
gpg --verify [pub_key] [file]

使用他人的公钥加密信息

1
2
3
4
5
6
7
8
9
10
11
12
13
# 导入他人 gpg 公钥文件
gpg --import [file]
# 查看 gpg 列表
gpg -k

# 验证导入的公钥,依旧是进入 gpg bash
gpg --edit-key [gpg_id]
# 查看指纹
fpr
# 如果指纹没有问题就通过
sign
# 保存
save

举个小栗子

因为没有上传到服务器,所以就没有对应的 gpg 指纹。这里放了一个 gpg 公钥的内容。你可以复制公钥的内容,在自己的系统上创建一个文本并把以下内容复制进去,然后导入到你的系统中,通过指纹验证后(指纹就是非缩写的 gpg_id 四位为一组分开)就可以使用该公钥加密要发送给浪子的信息,或者是验证签名。

1
2
3
4
5
6
7
8
9
10
11
12
13
-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEZnZfURYJKwYBBAHaRw8BAQdA2A26MqlvEmdvxTijbzTz76U0EvB4l08f9kta
/EyWPTC0F2pobHogPGpobHpsb3ZlQDE2My5jb20+iJMEExYKADsWIQQ5CChWQoQw
B0in/+tXfpaIaD1lvQUCZnZfUQIbAwULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIX
gAAKCRBXfpaIaD1lvQ9VAP0dedHC0bLAR32PFlwOv2sETeiTB6F8ZDUOebAW8XRv
dQD/eRNvOYwZ/gvsB4ab1rnu2D/lg8cqQdGOAds0qEs4sgG4OARmdl9REgorBgEE
AZdVAQUBAQdAC9QvugKU6B5QHMXCfRzop05iX2Jfm2vDpTjiSzFSJGwDAQgHiHgE
GBYKACAWIQQ5CChWQoQwB0in/+tXfpaIaD1lvQUCZnZfUQIbDAAKCRBXfpaIaD1l
vdYHAP95YfyXb4MfFg+oSclMBtvaca+nwHrfo3GZRsCHoq04ywEAvYIVv7uI648y
hJlZoGD+0Jb7tWq1/iAJo0fsxg++igU=
=eq5R
-----END PGP PUBLIC KEY BLOCK-----

由于 GPG 可以由他人上传,例如我冒充胡歌上传了一个 GPG(这其实并不是他传的),这样其实也不好追溯
指纹不要随便公开,指纹是 Hash 值,存在 Hash 碰撞,那么就可以被伪造,不安全

如果 Github 中使用 GPG 代替 SSH(浪子不是很推荐,使用还很麻烦。。。),虽然这可以让你的 Github 提交多一个很有精神的图标,保证来自本人的提交。

1
2
3
4
5
# -S 使用 GPG 验证提交,需要输入创建 GPG 的密码
git commit -S -m "YOUR_COMMIT_MESSAGE"

# 如果使用的是 czg
czg gpg

本站由 江湖浪子 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。