LV01-Git-03-首次运行Git前的配置

本文主要是初次使用Git前的一些相关配置的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
点击查看本文参考资料
点击查看相关文件下载
--- ---

一、配置文件

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。

1. 在Linux上的配置文件

(1)/etc/gitconfig 文件::包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此需要管理员或超级用户权限来修改它,但是默认好像不会创建这个文件,有需要的话需要自己创建)

(2)~/.gitconfig~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件,这会对系统上 所有 的仓库生效。

(3)当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。 (当然,需要进入某个 Git 仓库中才能让该选项生效。)

注意:每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。

我们可以通过以下命令查看所有的配置以及它们所在的文件:

1
git config --list --show-origin

2. 在Windows中的配置文件

在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users\$USER )的 .gitconfig 文件。 Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。

如果我们在 Windows 上使用 Git 2.x 以后的版本,那么还有一个系统级的配置文件,Windows XP 上在 C:\Documents and Settings\All Users\Application Data\Git\config ,Windows Vista 及其以后的版本在 C:\ProgramData\Git\config 。此文件只能以管理员权限通过 git config -f <file> 来修改。

我们可以通过以下命令查看所有的配置以及它们所在的文件:

1
git config --list --show-origin

如下图所示:

image-20230622071057360

二、基本配置

1. 用户信息

安装完 Git 之后,要做的第一件事就是设置用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到我们的每一次提交中,不可更改:

1
2
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论在该系统上做任何事情, Git 都会使用那些信息。 当想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。很多 GUI 工具都会在第一次运行时帮助我们配置这些信息。

2. 文本编辑器

我们还可以配置默认文本编辑器,当 Git 需要我们输入信息时会调用它。 如果未配置,Git 会使用操作系统默认的文本编辑器。如果想使用不同的文本编辑器,例如 Emacs,可以这样做:

1
git config --global core.editor emacs

在 Windows 系统上,如果想要使用别的文本编辑器,那么必须指定可执行文件的完整路径。 它可能随我们的编辑器的打包方式而不同。对于 Notepad++ ,一个流行的代码编辑器来说,我们可能想要使用 32 位的版本, 因为在《Pro Git Book》这本书编写时 64 位的版本尚不支持所有的插件。 如果我们在使用 32 位的 Windows 系统,或在 64 位系统上使用 64 位的编辑器,那么你需要输入如下命令:

1
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosess

【说明】vim、Emacs 和 Notepad++ 都是流行的文本编辑器,通常程序员们会在 Linux 和 macOS 这类基于 Unix 的系统或 Windows 系统上使用它们。 如果我们在使用其他的或 32 位版本的编辑器,可以在 git config core.editor 命令 中查看设置为该编辑器的具体步骤。

3. 检查配置信息

如果想要检查我们的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。

1
2
3
4
5
6
7
8
$ git config --list
user.name=John Doe
user.email=johndoe@example.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

我们可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。我们还可以通过输入 git config <key>: 来检查 Git 的某一项配置

1
2
$ git config user.name
John Doe

由于 Git 会从多个文件中读取同一配置变量的不同值,因此我们可能会在其中看到意料之外的值而不知道为什么。 此时,我们可以查询 Git 中该变量的 原始 值,它会告诉我们哪一个配置文件最后设置了该值:

1
2
$ git config --show-origin rerere.autoUpdate
file:/home/johndoe/.gitconfig false

4. 对LFCRLF的处理

Linux系统和Windows系统下的换行符不一样,Linux\n,即LFWindows下面是\r\n,即CRLFgit在维护版本库的时候统一使用的是LF。所以当文档跨平台进行编辑的时候,换行符就会产生差别,在不同平台编辑过得文件在进行commit的时候也会有相应的换行符警告。

1
LF will be replaced by CRLF in .......

那么怎么处理呢?这样就可以了(不过这样似乎只是治标不治本,仅仅是忽略了检查,要是文章的话还好,要是代码的话,有可能会因为换行符而出现问题,暂时先这样解决)。

1
git config --global core.autocrlf false

三、GitHub

1. GitHub是啥?

GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心。 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。 所以,尽管这不是 Git 开源项目的直接部分,但如果想要专业地使用 Git,我们将不可避免地与 GitHub 打交道,所以这依然是一个绝好的学习机会。

2. SSH

2.1 什么是SSH?

SSHSecure Shell的缩写,由IETF的网络小组(Network Working Group)所制定,是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境,其保证数据安全的原理是非对称加密

对称加密   使用的是一套秘钥,数据的加密以及解密用的都是同一套秘钥,当所有的客户端以及服务端都需要保存这套秘钥时,泄露的风险很高,而一旦秘钥便泄露便保证不了数据安全。
非对称加密   包含两套秘钥——公钥以及私钥,其中公钥用来加密,私钥用来解密,并且通过公钥计算不出私钥,因此私钥谨慎保存在服务端,而公钥可以随便传递,即使泄露也无风险。

SSH在正确使用时可弥补网络中的漏洞;SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议;利用SSH协议可以有效防止远程管理过程中的信息泄露问题。

SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UXLinuxAIXSolarisDigital UNIXIrix,以及其他平台,都可运行SSH

2.2 登录方式

方式 说明
密码登录 1.服务端收到登录请求后,首先互换公钥;
2.客户端用服务端的公钥加密账号密码并发送;
3.服务端用自己的秘钥解密后得到账号密码,然后进行验证;
4.服务端用客户端的公钥加密验证结果并返回;
5.客户端用自己的秘钥解密后得到验证结果.
公钥登录
(证书登录)
1.客户端用户必须手动地将自己的公钥添加到服务器一个名叫authorized_keys的文件里,顾名思义,这个文件保存了所有可以远程登录的机器的公钥;
2.客户端发起登录请求,并且发送一个自己公钥的指纹(具有唯一性,但不是公钥);
3.服务端根据指纹检测此公钥是否保存在authorized_keys中;
4.若存在,服务端便生成一段随机字符串,然后利用客户端公钥加密并返回;
5.客户端收到后用自己的私钥解密,再利用服务端公钥加密后发回;
6.服务端收到后用自己的私钥解密,如果为同一字符串,则验证通过.

【参考文章】

2.3 SSH服务安装

2.3.1 在Linux上使用SSH

  • (1)查询是否安装SSH服务端,可以使用以下命令
1
sudo ps -e |grep ssh

查询情况如下图所示:

终端返回结果中没有 sshd,则说明系统还没有安装 ssh-server 服务,后续对ssh进行安装

  • (2)若是没有安装SSH服务端,可以使用以下命令安装ssh服务
1
sudo apt-get install openssh-server
  • (3)检查SSH服务端是否安装成功
1
sudo ps -e |grep ssh

安装情况如下图所示:

ssh安装情况

出现了sshd,说明ssh服务已经正常启动了,若安装完毕后,还是没有sshd出现,那么就进行下一步,手动启动ssh服务。

  • (4)启动 ssh服务
1
sudo /etc/init.d/ssh start 
启动ssh

运行完毕之后,重新查询ssh服务即可。

SSH服务常用相关命令

1
2
3
sudo /etc/init.d/ssh stop  # 停止服务
sudo /etc/init.d/ssh start # 启动服务
sudo /etc/init.d/sshresart # 重启服务

2.3.2 在Windows上使用SSH

Windows中,SSH服务好像是系统自带的功能,我使用的时候是直接就用了,默认是开启的,但是有的时候默认可能关闭,这个时候我们按以下步骤操作:

  • (1)检查SSH,我们打开命令行,输入ssh查看是否有输出信息
image-20230622073618153

我的电脑之前开启过,多以这里会输出ssh命令的使用帮助,但是若是出现类似找不到命令之类的,那就说明SSH服务没有开启。若是没有开启那就执行后边的步骤。

  • (2)之后的Windows10或者Windows11版本已经支持OpenSSH服务。默认程序已经安装好了OpenSSH 客户端,【Windows设置】→【应用】→【应用和功能】→【可选功能】就可看到系统已经安装好的可选功能,如下图所示
image-20230622073953717

若在已安装列表里面没有OpenSSH 服务端,单击添加功能找到OpenSSH 服务端等待安装完毕即可,下载完毕根据提示可能需要重启电脑(有需要的话就重启,不需要就算了)。之后,就可以再次在cmd中键入ssh查看自己的ssh服务是否已成功启动。若安装完后,cmd中还是没有上图中的显示,则考虑是环境变量的问题。

  • (3)开启SSH服务,【Win+S】→【键入服务】→【打开本地服务界面】→【找到OpenSSH SSH Server】→【启动方式改为自动】
image-20230622074503504

2.4 Windows终端登录Ubuntu

2.4.1 虚拟机网络模式配置

  • VMware中虚拟网络编辑器设置如下

虚拟网络编辑器

  • 虚拟机的网络适配器也需改为桥接模式

2.4.2 查看windows和Ubuntu网络地址

  • Windows:ipconfig
  • Ubuntu: ifconfig

若Ubuntu出现以下情况,安装net-tools即可,安装命令:

1
sudo apt install net-tools
net-tools安装
  • 记录下Ubuntu的IP地址,如下图。
查看ip

2.4.3 是否能ping通?

ssh服务远程登录需要保证两个IP可以ping通,也就是可以正常的通信,我们可以使用命令,在Windows命令行执行以下命令和Ubuntu的终端,后边的ip要写对方的IP地址,保证两者可以互相ping通。

1
ping <ip-address>
window通信检测

2.4.4 登录Ubuntu

我们在Windows的命令行中执行以下命令登录VMware中的Ubuntu:

1
ssh user-name@ip-address

首次登录会出现如下提示,输入用户密码即可。

首次登录ubuntu

2.4.5 登录成功的效果

登录过程中可能会提示输入密码,如下图所示:

登录成功

由于是整理之前的笔记,我重新登陆了一下,不过此时换成了ubuntu的名字发生了变化罢了:

image-20230622075604500

3. SSH访问GitHub

到这一部分的时候,在Linux下或者Windows中执行的命令都是一样的,最多就是文件位置或者打印信息可能有所区别,这里以Ubuntu(内核为Linux)为例说明。

3.1 检查SSH是否可以连接GitHub

  • 我们可以通过以下命令检查ssh是否可以连接到GitHub
1
ssh -T git@github.com
  • 连接失败的情况

若出现以下提示,则不能连接到github,需要重新配置,按照后边配置即可。

1
2
3
4
5
The authenticity of host 'github.com (20.205.243.166)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,20.205.243.166' (ECDSA) to the list of known hosts.
git@github.com: Permission denied (publickey).
image-20220108212328636
  • 连接成功的情况

若连接成功,则会有如下提示,可以跳过后边的配置步骤,直接开始使用 Git。

1
Hi qidaink! You've successfully authenticated, but GitHub does not provide shell access.
image-20220108213009689

3.2 安装 ssh keys 

【注意】:Linux下相关的文件在~/.ssh目录,在Windows中的话在C:\Users\<用户名>\.ssh这个目录,这里以Linux中的操作为例。

  • (1)检查相应的文件是否存在

主要是检查文件id_rsa(私钥)id_rsa.pub(公钥)是否存在。

1
2
cd ~/.ssh
ls
image-20220108220705441

发现没有id_rsa(私钥)id_rsa.pub(公钥)这两个文件,说明没有ssh keys。若有这两个文件,那么就移除当前的id_rsa(私钥)id_rsa.pub(公钥)

1
rm ~/.ssh/id_rsa*
  • (2)重新生成id_rsaid_rsa.pub
1
2
3
4
5
# 一开始用的这个命令
ssh-keygen -t rsa -C "user's github email address"

# 后来好像必须要用下边这个命令,后边会解释为什么
ssh-keygen -t ed25519 -C "user's github email address"

user's github email address就是自己注册github时的邮箱。执行后会出现以下提示信息,其中有两次是让用户选择文件生成位置及设置密码的,不输入,直接按三次enter按键,表示路径默认,不需要密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hk/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hk/.ssh/id_rsa.
Your public key has been saved in /home/hk/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:cfJKNOMTwZf3j6t7aqbEqosgtQ2z0d0PWe+TckfHsZQ 2038035593@qq.com
The key's randomart image is:
+---[RSA 2048]----+
| .. . |
| ..o . .|
| B.o. . E |
| . . + @ . o.o|
| = . . S . . .+o|
| . B . * . o...|
|. + . . = = .. |
| . . . o oooo |
| . oo. .++= |
+----[SHA256]-----+

【注意】由于写笔记的时候时间比较早,上边的命令生成的秘钥可能会有问题,就是在后边使用git clone命令的时候可能会报以下错误:

1
ERROR: You're using an RSA key with SHA-1, which is no longer allowed. Please use a newer client or a different key type.

原来是githubSSH密钥做了升级(Improving Git protocol security on GitHub),原来的SHA-1等一些已经不支持了。所以我们可以生成新的Ed25519密钥对:

1
ssh-keygen -t ed25519 -C "user's github email address"
  • (3)打开~/.ssh文件夹
1
2
3
# 进入文件夹
cd ~/.ssh
gedit id_rsa.pub

会发现生成了id_rsa和id_rsa.pub文件,然后我们使用编辑器打开id_rsa.pub文件,并复制所有内容。

image-20220108221913272

添加完毕后会收到一封邮件,表示已经添加成功。

image-20220108222227365
  • (5)按3.1节再次检查是否可以正常连接
1
ssh -T git@github.com

四、配置脚本

为了偷懒,我写了一个在ubuntu中配置Git的脚本,由于还带有一些其他功能,就直接看链接吧:my-software-config: 一些软件的配置文件或者系统的配置脚本 (gitee.com)

1. 安装Git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 安装git
function git_install_online()
{
cd ~
echo -e "${INFO}${PINK}current path:$(pwd)${CLS}"
echo -e "${INFO}检查git是否安装..."
if ! $(command -v git >/dev/null 2>&1) ; then
echo -e "${ERR}git 尚未安装!!!"
read -p "是否安装git?(默认选择继续,退出请输入n):" ret
if [ "${ret}" != "n" ];then
sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt-get install git
echo -e "${INFO}安装完毕,当前git版本如下:"
else
return
fi
else
echo -e "${INFO}git 已安装,当前git版本如下:"
fi
git_version=$(git -v | sed -n "1p")
echo ${git_version}
}

2. 安装SSH服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装ssh-server
function ssh_server()
{
cd ~
echo -e "${INFO}${PINK}current path:$(pwd)${CLS}"
ssh_info=$(ps -e | grep ssh | grep "sshd")
if [ "${ssh_info}" == "" ];then
echo -e "${ERR}ssh-server 尚未安装,准备安装 ssh-server..."
sudo apt-get install openssh-server
sudo /etc/init.d/ssh start
echo -e "${INFO}ssh-server 安装完毕,信息如下:"
else
echo -e "${INFO}ssh-server 已安装,信息如下:"
fi

ssh_info=$(ps -e | grep ssh | grep "sshd")
echo $ssh_info
}

3. 配置Git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 配置git
function git_config()
{
cd ~
echo -e "${INFO}${PINK}current path:$(pwd)${CLS}"
if ! $(command -v git >/dev/null 2>&1) ; then
echo -e "${ERR}git 尚未安装,请先安装git!!!"
return
else
echo -e "${INFO}git 已安装,当前git版本如下:"
fi
git_version=$(git -v | sed -n "1p")
echo ${git_version}

read -p "是否需要配置git基本信息?(默认选择继续,不需要请输入n):" ret
if [ "${ret}" != "n" ];then
echo -e "${INFO}开始配置git基本信息..."
read -p "请输入 gitee 用户名: " giteeuser
read -p "请输入 gitee 邮箱: " giteeemail
git config --global user.name "${giteeuser}"
git config --global user.email "${giteeemail}"
git config --global core.autocrlf false
git config --global alias.mylog "log --graph --pretty=format:'%C(magenta)[%an]%C(reset) %C(red)%h%C(reset) : %C(green)%s%C(reset) %C(yellow)%d%C(reset) %C(blue)(%cr)%C(reset)' --abbrev-commit --date=relative"
echo -e "${INFO}git基本信息完成,配置项如下:"
git config --list --show-origin
fi

read -p "是否需要配置SSH?(默认选择继续,不需要请输入n):" ret
if [ "${ret}" != "n" ];then
echo -e "${INFO}开始检查SSH..."
ssh -T git@gitee.com
read -p "输出是否含有: git@gitee.com: Permission denied (publickey). ?(y or n)" ret
if [ "${ret}" = "y" ] || [ "${ret}" = "" ]; then
echo -e "${ERR}SSH未安装,无法连接到 gitee!!!"
else
echo -e "${INFO}SSH已安装,可正常使用!!!"
read -p "是否重新安装 SSH ?(默认退出,继续输入y)" ret
if [ "${ret}" != "y" ]; then
return
else
rm -rvf ~/.ssh
fi
fi
echo -e "${INFO}开始配置SSH(gitee)..."
read -p "请输入一个标识,可以是邮箱:" sshkey
ssh-keygen -t ed25519 -C ${sshkey} # 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱
echo -e "${INFO}即将生成sshkey,不需要特别需求时可直接依提示按三次回车!!!"
echo -e "${INFO}即将打开sshkey,复制后可按 q 返回..."
sleep 2s
less ~/.ssh/id_ed25519.pub
echo -e "${INFO}配置完成,请将sshkey添加到gitee或者github!"
echo -e "${INFO}【Github】→【登录账号】→【头像】→【Setting】→【SSH and GPG keys 】→【SSH keys】→【New SSH key】"
echo -e "${INFO}【Gitee】→【登录账号】→【头像】→【账号设置】→【安全设置】→【SSH公钥】→【添加公钥】"
echo -e "${INFO}https://github.com/settings/keys"
echo -e "${INFO}https://gitee.com/profile/sshkeys"
sleep 2s
fi
}