LV010-Git配置
一、配置文件
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 中的配置变量。
我们可以通过以下命令查看所有的配置以及它们所在的文件:
git config --list --show-origin2. 在 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> 来修改。
我们可以通过以下命令查看所有的配置以及它们所在的文件:
git config --list --show-origin如下图所示:

二、基本配置
1. 用户信息
安装完 Git 之后,要做的第一件事就是设置用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到我们的每一次提交中,不可更改:
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论在该系统上做任何事情, Git 都会使用那些信息。 当想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。很多 GUI 工具都会在第一次运行时帮助我们配置这些信息。
2. 文本编辑器
我们还可以配置默认文本编辑器,当 Git 需要我们输入信息时会调用它。 如果未配置,Git 会使用操作系统默认的文本编辑器。如果想使用不同的文本编辑器,例如 Emacs,可以这样做:
git config --global core.editor emacs在 Windows 系统上,如果想要使用别的文本编辑器,那么必 须指定可执行文件的完整路径。 它可能随我们的编辑器的打包方式而不同。对于 Notepad++ ,一个流行的代码编辑器来说,我们可能想要使用 32 位的版本, 因为在《Pro Git Book》这本书编写时 64 位的版本尚不支持所有的插件。 如果我们在使用 32 位的 Windows 系统,或在 64 位系统上使用 64 位的编辑器,那么你需要输入如下命令:
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 当时能找到的配置。
$ 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 的某一项配置
$ git config user.name
John Doe由于 Git 会从多个文件中读取同一配置变量的不同值,因此我们可能会在其中看到意料之外的值而不知道为什么。 此时,我们可以查询 Git 中该变量的 原始 值,它会告诉我们哪一个配置文件最后设置了该值:
$ git config --show-origin rerere.autoUpdate
file:/home/johndoe/.gitconfig false4. 对 LF 和 CRLF 的处理
Linux 系统和 Windows 系统下的换行符不一样,Linux 是 \n,即 LF,Windows 下面是 \r\n,即 CRLF,git 在维护版本库的时候统一使用的是 LF。所以当文档跨平台进行编辑的时候,换行符就会产生差别,在不同平台编辑过得文件在进行 commit 的时候也会有相应的换行符警告。
LF will be replaced by CRLF in .......那么怎么处理呢?这样就可以了(不过这样似乎只是治标不治本,仅仅是忽略了检查,要是文章的话还好,要是代码的话,有可能会因为换行符而出现问题,暂时先这样解决)。
git config --global core.autocrlf false三、GitHub
1. GitHub 是啥?
GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心。 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。 所以,尽管这不是 Git 开源项目的直接部分,但如果想要专业地使用 Git,我们将不可避免地与 GitHub 打交道,所以这依然是一个绝好的学习机会。
2. SSH
2.1 什么是 SSH?
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定,是一种加密的 网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境, 其保证数据安全的原理是 非对称加密。
| 对称加密 | 使用的是一套秘钥,数据的加密以及解密用的都是同一套秘钥,当所有的客户端以及服务端都需要保存这套秘钥时,泄露的风险很高,而一旦秘钥便泄露便保证不了数据安全。 |
| 非对称加密 | 包含两套秘钥——公钥以及私钥,其中公钥用来加密,私钥用来解密,并且通过公钥计算不出私钥,因此私钥谨慎保存在服务端,而公钥可以随便传递,即使泄露也无风险。 |
SSH 在正确使用时可弥补网络中的漏洞;SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议;利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH 最初是 UNIX 系统上的一个程序,后来又迅速扩展到其他操作平台。SSH 客户端适用于多种平台。几乎所有 UNIX 平台—包括 HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行 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 服务端,可以使用以下命令
sudo ps -e |grep ssh查询情况如下图所示:

终端返回结果中没有 sshd,则说明系统还没有安装 ssh-server 服务,后续对 ssh 进行安装
- (2)若是没有安装 SSH 服务端,可以使用以下命令安装 ssh 服务
sudo apt-get install openssh-server- (3)检查 SSH 服务端是否安装成功
sudo ps -e |grep ssh安装情况如下图所示:

出现了 sshd,说明 ssh 服务已经正常启动了,若安装完毕后,还是没有 sshd 出现,那么就进行下一步,手动启动 ssh 服务。
- (4)启动 ssh 服务
sudo /etc/init.d/ssh start
运行完毕之后,重新查询 ssh 服务即可。
SSH 服务常用相关命令
shellsudo /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 查看是否有输出信息

我的电脑之前开启过,多以这里会输出 ssh 命令的使用帮助,但是若是出现类似找不到命令之类的,那就说明 SSH 服务没有开启。若是没有开启那就执行后边的步骤。
- (2)之后的 Windows10 或者 Windows11 版本已经支持 OpenSSH 服务。默认程序已经安装好了 OpenSSH 客户端,【Windows 设置】→【应用】→【应用和功能】→【可选功能】就可看到系统已经安装好的可选功能,如下图所示

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

2.4 Windows 终端登录 Ubuntu
2.4.1 虚拟机网络模式配置
- VMware 中虚拟网络编辑器设置如下

- 虚拟机的网络适配器也需改为桥接模式
2.4.2 查看 windows 和 Ubuntu 网络地址
- Windows:
ipconfig - Ubuntu:
ifconfig
若 Ubuntu 出现以下情况,安装 net-tools 即可, 安装命令:
sudo apt install net-tools
- 记录下 Ubuntu 的 IP 地址,如下图。

2.4.3 是否能 ping 通?
ssh 服务远程登录需要保证两个 IP 可以 ping 通,也就是可以正常的通信,我们可以使用命令,在 Windows 命令行执行以下命令和 Ubuntu 的终端,后边的 ip 要写对方的 IP 地址,保证两者可以互相 ping 通。
ping <ip-address>
2.4.4 登录 Ubuntu
我们在 Windows 的命令行中执行以下命令登录 VMware 中的 Ubuntu:
ssh user-name@ip-address首次登录会出现如下提示,输入用户密码即可。

2.4.5 登录成功的效果
登录过程中可能会提示输入密码,如下图所示:

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

3. SSH 访问 GitHub
到这一部分的时候,在 Linux 下或者 Windows 中执行的命令都是一样的,最多就是文件位置或者打印信息可能有所区别,这里以 Ubuntu(内核为 Linux)为例说明。
3.1 检查 SSH 是否可以连接 GitHub
- 我们可以通过以下命令检查 ssh 是否可以连接到 GitHub
ssh -T git@github.com- 连接失败的情况
若出现以下提示,则不能连接到 github,需要重新配置,按照后边配置即可。
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).
- 连接成功的情况
若连接成功,则会有如下提示,可以跳过后边的配置步骤,直接开始使用 Git。
Hi qidaink! You've successfully authenticated, but GitHub does not provide shell access.
3.2 安装 ssh keys
【注意】:Linux 下相关的文件在 ~/.ssh 目录,在 Windows 中的话在 C:\Users\<用户名>\.ssh 这个目录,这里以 Linux 中的操作为例。
- (1)检查相应的文件是否存在
主要是检查文件 id_rsa(私钥) 和 id_rsa.pub(公钥) 是否存在。
cd ~/.ssh
ls
发现没有 id_rsa(私钥) 和 id_rsa.pub(公钥) 这两个文件,说明没有 ssh keys。若有这两个文件,那么就移除当前的 id_rsa(私钥) 和 id_rsa.pub(公钥):
rm ~/.ssh/id_rsa*- (2)重新生成
id_rsa和id_rsa.pub
# 一开始用的这个命令
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 按键,表示路径默认,不需要密码。
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 命令的时候可能会报以下错误:
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.原来是 github 对 SSH 密钥做了升级(Improving Git protocol security on GitHub),原来的 SHA-1 等一些已经不支持了。所以我们可以生成新的 Ed25519 密钥对:
ssh-keygen -t ed25519 -C "user's github email address"- (3)打开
~/.ssh文件夹
# 进入文件夹
cd ~/.ssh
gedit id_rsa.pub会发现生成了 id_rsa 和 id_rsa.pub 文件,然后我们使用编辑器打开 id_rsa.pub 文件,并复制所有内容。
- (4)添加
ssh keys到github:【Github】→【登录账号】→【头像】→【Setting】→【SSH and GPG keys】→【SSH keys】→【New SSH key】

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

- (5)按
3.1节再次检查是否可以正常连接
ssh -T git@github.com四、配置脚本
为了偷懒,我写了一个在 ubuntu 中配置 Git 的脚本,由于还带有一些其他功能,就直接看链接吧:my-software-config: 一些软件的配置文件或者系统的配置脚本 (gitee.com)
1. 安装 Git
# 安装 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 服务
# 安装 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
# 配置 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
}