需求
准备工作
配置用户信息
Git的验证方式
生成SSH-KEY
一、配置单个SSH
1. 复制你的公钥内容到第三方Git服务器
2. 测试SSH密钥
二、配置多个SSH
三、上传本地项目到第三方Git服务器(针对新工程)
四、使用IntelliJ IDEA从第三方Git服务器拉取工程到本地
a. 配置一个 DevCloud 账号
b. 配置两个不同账号:一个 gitee,用于公司内部的工作开发;一个 github,用于自己进行一些开发活动
c. 配置两个相同账号:一个是华为云企业子账号用于公司内部的开发工作;一个是自己的华为云账号用于自己进行一些开发活动。
上述的 gitee,github,DevCloud 或其他如 gitlab 等等,以下统称第三方Git服务器。
d. 使用 IntelliJ IDEA 上传本地项目到第三方Git服务器(针对新工程)
e. 使用 IntelliJ IDEA 从第三方Git服务器拉取工程到本地
1. 下载并安装Git
2. 下载并安装IntelliJ IDEA
此处不再赘述,网上有很多教程。
安装好 Git 之后,首先我们配置一下用户信息,有 name 和 email。这个用户信息有什么作用呢,用于你提交代码的时候使用,你会看到你提交代码的名字使用的是 name 配置的名字,email 没有特殊要求。用户信息配置分为全局变量配置和局部变量配置,还有一个系统级的配置用的很少这里不赘述。
1. 全局变量配置用户信息
git config --global user.name "John Doe"
git config --global user.email "[email protected]"
这里的 --global 表示全局变量级别的,配置信息会保存在 ~/ 目录下的 .gitconfig 文件中。
2. 局部变量配置用户信息
git config --local user.name "John Doe"
git config --local user.email "[email protected]"
区别在于 --local 选项。要配置局部变量级别的用户信息,只能在 Git 仓库内使用,也就是说只能在工程目录中使用,配置成功之后,会保存在工程目录中隐藏的 .git 目录中的 config 文件中。
需要注意的是,用户信息的使用优先级:local > global。
当我们同时配置了全局级别的用户信息和局部变量级别的用户信息时,使用 git commit 代码时,Git 会先检查是否存在局部变量级别的用户信息,如果存在则使用,如果不存在会检查是否存在全局变量级别的用户信息,如果存在则使用,如果都不存在,操作会失败;如果都不存在,使用 IntelliJ IDEA 提交代码时,会让你输入用户信息,且有一个勾选项,勾了之后点击 OK 会自动保存全局变量级别的用户信息,如果不勾点击 OK 会自动保存局部变量级别的用户信息。
HTTPS方式,第一次使用时需要输入账号和密码,账号密码可以在第三方Git服务器上配置。系统会把账号密码保存在:控制面板 > 用户账户 > 凭据管理器 中的 Windows凭据 中进行管理,不需要每次使用时都输入账号密码。网上有人说用 HTTPS 方式每次提交代码都会让输账号密码我没有遇到过。
更多关于 SSH keys 的文档请查看:SSH keys (简体中文)
在工程目录下右键点击 "Git Bash Here",进入命令行终端。
ssh-keygen -t rsa -C "邮箱地址"
-C "邮箱地址",这里的邮箱地址只是一个生成 随机密钥 的随机字符串而已,有些第三方Git服务器要求真实有效的邮箱地址,甚至有些第三方Git服务器会要求使用注册时账号绑定的邮箱地址。但是我曾经用 "abc" 代替邮箱地址生成 SSH 密钥,在第三方Git服务器上成功克隆代码到本地。但是为了方便记忆,使用注册时绑定的真实有效的邮箱地址即可。那么当要配置多个 SSH 密钥时,可以使用同一个邮箱地址。
你可能会有疑问,如果用同一个邮箱地址计算出来的密钥是否一致。注意我前面说的是 "随机密钥",你用同一个邮箱地址通过 rsa 算法生成的密钥是不同的。这里你可能注意到了,-t 就是你要选择的加密算法。
接下来我们执行看一下:
1. 输入你的密钥名字,可以不输直接回车,默认名字为 id_rsa,默认存储目录是一个隐藏目录:~/.ssh/。如果我们要配置多个 SSH 密钥时,这里的名字要区分开,比如我要配置两个 SSH 密钥,一个是 gitee 我这里取名叫 gitee_id_rsa;另一个是 github 我这里取名叫 github_id_rsa。
2. 输入一个密码。此密码与 HTTPS 密码不同,设置密码后在命令端使用 Git 命令操作工程代码时(如 pull 代码)每次都会要求输入该密码。其目的是为了防止当私钥被窃取时不容易被破解导致第三方Git服务器上的代码丢失(或 SSH 服务器上的重要文件丢失)。但是在 IntelliJ IDEA 中点击记住密码只需要输入一次,往后就不会再提示输入密码。我这里设置了密码,如果没有输入密码,回车即可。
此密码一定不要忘记,如果忘记可以删除第三方Git服务器公钥,重新生成SSH密钥进行配置。可以在不修改密钥对的情况下修改第2点设置的密码,使用下列命令:
ssh-keygen -f ~/.ssh/id_rsa -p
-f ~/.ssh/id_rsa 找到你要修改密码的私钥,-p 回车后,先输入原密码,再输入两次新密码。
3. 再次输入密码,确认密码。第2点没有输入密码,这里直接回车即可。
看一下默认生成的密钥存储目录 ~/.ssh/:
可以看到除了生成了一个名叫 id_rsa 的私钥以外,还生成了一个名叫 id_rsa.pub 的公钥,公钥以 .pub 结尾。同理,当配置有多个 SSH 密钥时,根据 SSH 密钥名字也会有对应的公钥。如第1点的例子,这里还会有 gitee_id_rsa.pub 和 github_id_rsa.pub。
我们把修改密码的命令去掉 -P 也是生成密钥:
ssh-keygen -t rsa -C "邮箱地址" -f d:/Learning/abc
-f d:/Learning/abc 指定 SSH 密钥存储的位置和名字,意为把名叫 abc 的私钥和公钥存储在 d:/Learning/ 目录下,公钥名字由私钥名字加 .pub 即 abc.pub。如果没有特殊要求一般都把 SSH 密钥放到默认目录 ~/.ssh/ 下。
使用命令复制公钥,避免复制不完整。
clip < ~/.ssh/id_rsa
复制第三方Git服务器的 SSH 链接
截取@与:之间的地址
使用如下命令测试
ssh -T [email protected]
1. 第一次连接第三方Git服务器(或 SSH 服务器)时,会询问你是否要建立连接,输入 yes 之后,Git 会在默认存储目录下新建一个文件:known_hosts 用于记录已知的服务器地址,一般不会操作这个文件。
2. 如果生成 SSH 密钥的时候设置了密码,那么这里要输入密码验证。如果没有设置,就没有第2点。
3. 这里显示 Welcome to DevCloud,xxxxx!表示成功连上第三方Git服务器。
需要注意的是,这里的密钥名字没有设置,是使用的默认名字 id_rsa,Git 会默认使用名字为 id_rsa 的私钥。如果设置了自定义名字,有两种方法解决:第一种是使用 SSH agent 管理器,第二种是使用配置文件管理。下面先介绍第一种方法。
我这里的私钥名字是 abc,公钥名字是 abc.pub。这个时候用如上命令测试时,会提示:Permission denied 没有权限。
这时候我们使用 SSH agent 管理器。SSH agent 程序能够将你的已解密的私钥缓存起来,在需要的时候提供给你的 SSH 客户端。这样子,你就只需要将私钥加入 SSH agent 缓存的时候输入一次密码就可以了。
ssh-add ~/.ssh/abc
如果出现如下错误
可以使用下列命令解决
eval $(ssh-agent) 或者 ssh-agent bash
1. 这里应该不陌生了,如果生成 SSH 密钥的时候设置了密码,那么这里要输入密码验证。如果没有设置,就没有这一行。
2. 表示添加成功,我们再测试一下。
成功了,并且没有要求输入密码验证,说明 SSH agent 管理器已经把我们已解密的私钥缓存起来了。这种方法有局限性,当我们始终在此终端下,我们可以一直使用这个密钥,并且不用输入密码验证。但是当我们重新打开一个 Git 命令行终端,再次使用这个密钥时,就会提示 Permission denied 没有权限,这个时候我们又需要使用 SSH agent 管理器再操作一次,这就很麻烦了。当然还有其他的一些密钥管理器,比如 GnuPG,Keychain 等等,有兴趣可以自行了解。
我个人不推荐使用第一种方法来解决使用非默认名的密钥。我常用第二种方法,接下来我们看一下如何使用配置文件来管理。
首先在默认存储目录下新建一个名为 config 的配置文件,并且写入配置。
原本我们在第三方Git服务器复制的 SSH 链接,可以直接使用(使用默认名密钥的情况下),例如:
[email protected]:name/repo.git
但是,现在根据你的账号不同,需要自行替换:
git@dc_1:name/repo.git 或 git@dc_2:name/repo.git
测试一下
提示输入密码验证,成功连接上服务器。这样虽然每次使用都会要求输入密码,但是我们可以不设置密码,看个人需求,为什么设置密码之前也讲过了。而且只是在命令行终端会要求输入密码验证,在 IntelliJ IDEA 中使用只需要第一次输入密码验证,之后在 IntelliJ IEDA 中操作 Git 就不用输入密码验证了。使用配置文件来管理方便我们管理多个 SSH 密钥,后面我们会讲到。到此,页首的需求 a 就配置完成了。
我已经生成了两个密钥,分别叫 dc_1,dc_2 放到默认存储目录下
在华为云企业子账号代码托管中添加 dc_1.pub 公钥,在自己的华为云账号代码托管中添加 dc_2.pub 公钥。
如果默认存储目录 ~/.ssh/ 下没有 config 文件,新建 config 文件,配置如下
分别测试一下
第一次询问了是否要建立连接,因为我生成 SSH 密钥的时候设置了密码,所以两次都输入了密码验证。
两次测试成功连上华为云 Git 服务器。
到此,页首的需求 c 就配置完成了。需求 b 举一反三就行了。我这里讲的很简单,只要理解了前面 配置用户信息,生成SSH-KEY,配置单个SSH 的内容,就已经可以自己实现配置多个 SSH 了,我就不再赘述了。
The authenticity of host '[localhost]:29418 ([::1]:29418)' can't be established.
RSA key fingerprint is e8:e2:fe:19:6f:e2:db:c1:05:b5:bf:a6:ad:4b:04:33.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:29418' (RSA) to the list of known hosts.
Permission denied (publickey).
如果看到这个消息,说明Gerrit没有识别出你提交的任何密钥。ssh默认会发送id_rsa,要确认它的确发送了该值,可以查看.ssh/config,文件头上有一行IdentityFile ~/.ssh/id_rsa。可以运行ssh -v -p 端口号 username@ip 查看发送的内容:
debug1: Next authentication method: publickey
debug1: Trying private key: /Users/demo/.ssh/id_dsa
debug1: Offering public key: /Users/demo/.ssh/id_rsa
最后,要验证具体的密钥,可以运行ssh -i ~/.ssh/id_rsa显式地选择要使用的密钥,而不是让它自动选择密钥。如果这样可以工作,但不带-i参数却不行的话,那么问题出在你的~ /.ssh/config文件里――你需要保证选择了合适的IdentityFile。
配置gerrit服务器使用的秘钥配置文件config(config路径和名字与上述一样):
#gerrit本地服务器,admin管理员用户
Host gerrit_admin
HostName localhost
User admin
Port 29418
PreferredAuthentications publickey
IdentityFile ~/.ssh/gerrit_admin
通过命令:SSH gerrit_admin,验证gerrit服务器能否连接成功。成功提示如下:
当我们在一台电脑上有多个密钥时,上述方法解决了本机与多个服务器之间通过密钥连接的问题。但是如果A项目使用git命令时,A项目所在仓库地址为A_repo,A_repo仓库所在git服务器与本机连接的密钥对不是默认的 id_rsa,id_rsa.pub 名字,可能会出现如下错误:
因为我们虽然在 ~/.ssh/ 目录中配置了config文件,但是每个项目并不认识config里面的配置,这时我们只需在报错的项目中找到本地仓库 .git/config 文件,把 [remote "origin"] 节点下面的 url 参数中的地址修改为 ~/.ssh/ 目录中 config 文件中对应的 Host 别名即可。
例如:
改为
首先在 IntelliJ IDEA 中配置 Git。找到 IntelliJ IDEA 版本控制中 Git,在 File –> Setting –> Version Control –> Git –> Path to Git executable。
在 Git 的安装路径下找到 cmd 文件夹下的 git.exe 配置完成。
检查 Git 在 IntelliJ IDEA 中是否配置成功,点击 "Test",如下图表示配置成功。
在本地用 IntelliJ IDEA 创建一个新工程
到 IntelliJ IDEA 中点击菜单 VCS - Import into Version Control - Create Git Repository 选项。注意如果你使用的第三方Git服务器有对应于 IntelliJ IDEA 的插件,就在此选择对应的插件即可,操作都大同小异。
选择工程目录
你会发现所有文件全部变红了
去第三方Git服务器新建一个代码仓库,选择 gitignore 语言和生成 README.md 文件。
复制SSH链接
到 IntelliJ IDEA 中点击菜单 VCS - Git - Remotes 选项。
点击 + 添加替换了 SSH 链接中@与:中间的地址后的链接。如果有设置 SSH 密钥密码,这里会提示输入密码验证,没提示就略过。
pull 代码,与远程仓库建立连接。把远程代码仓库中的文件拉取到本地,如果没有远程仓库地址,就检查上一步;如果没有分支,就刷新一下。
在 pull 下来的 .gitignore 文件中添加规则,把 .idea 文件夹、target 文件夹、*.iml 文件忽略掉不让 Git 识别上传。.idea 文件夹中是开发工具的配置文件;target 文件夹是 maven 构建工具编译或者打包的目录,如果是手动构建或者其他构建工具改为对应的构建目录文件夹;*.iml 文件是 module 描述文件,工程中如果没有 *.iml 文件很可能会导致 IntelliJ IDEA 识别不出工程目录,IntelliJ IDEA 在检出或者导入项目的时候一般会自动生成该文件。
可以把 .idea 文件夹中的文件一一甄别,把涉及隐私和重要数据信息的文件忽略掉,其他关于代码风格配置或代码模板配置的通用性配置文件可以上传到远程代码仓库,这样做有利于团队开发。如果觉得甄别很麻烦,可以去 gitignore.io 网站在搜索框中输入你使用的开发工具,编程语言,平台系统点击创建,会生成一个把不能暴露的文件忽略掉的 .gitignore 规则列表方便我们使用。
但我个人倾向于远程仓库是纯粹代码相关的,所以我全部忽略掉。
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
# Modules file
*.iml
# IntelliJ IDEA configuration file
/.idea
# Build directory
/target
把所有文件都提交到本地仓库
提交本地仓库成功,文件颜色恢复正常
push 代码
第三方Git服务器远程仓库已经有代码了
到此,页首的需求 d 就完成了。
把刚刚的本地工程删除,就以远程仓库的 Demo1 工程为例。实现使用 IntelliJ IDEA 从第三方Git服务器拉取工程到本地。
IntelliJ IDEA 有三个方法可以从第三方Git服务器拉取工程到本地:
1. 欢迎页面的 Check out from Version Control。如果第三方Git服务器有插件就选择对应的插件,比如 Gitee。
2. 菜单 File > New > Project from Version Control。
3. 菜单 VCS > Checkout from Version Control。
第一个方法和第三个方法其实是同一个,只是入口不一样而已。第二个方法我个人不推荐,因为它不会提示相关配置。
我演示常用的第三个。首先复制第三方Git服务器中的 SSH 链接。
找到第三个的菜单 Git 按钮,这里不仅可以使用 SSH 链接还可以使用 HTTPS 链接。把 SSH 链接复制到 URL 中,如果配置了多个 SSH 密钥,记得替换掉@与:之间的地址,在 Directory 选择你要存放工程的目录,即工程的根目录,点击 clone。
IntelliJ IDEA 会询问你是否检出,点击 Yes 会进行一些配置,点击 No 表示默认配置。这里选择 Yes。
你会看到一个 Import Project 的配置面板,这就是前面说的第二个方法不会提示相关配置。第一页是选择工程构建工具,这里选择 Maven。
第二页配置工程的根目录以及相关的一些配置,没有特殊要求默认即可,继续 Next。
这里要注意一下,第一排的 Root directory 与 克隆时候选择的 Directory 默认是一致的,因为下一页是选择 Maven 工程的 pom.xml 文件,而 pom.xml 文件肯定是在克隆时候选择的 Directory 目录下。如果改变了 Root directory 目录找不到 pom.xml 文件,会导致下一页的 Next 点击提示警告。
第三页选择 Maven 工程的 pom.xml 文件,继续 Next。
第四页会让你选择 JDK 引入 JAVA 运行环境的 jar 包,一般会默认找到你本机配置的 JDK。一样 Next。
第五页配置工程的工作空间目录即 Workspace,这里可以任意指定目录,哪怕工程根目录不在这个目录中,IntelliJ IDEA 也可以引用。无多个 module 工程或特殊的情况,默认即可。最后点击 Finish。
这里提一句 IntelliJ IDEA 与 Eclipse 的目录的区别:
IntelliJ 系中的 Project 相当于 Eclipse 系中的 Workspace;
IntelliJ 系中的 Module 相当于 Eclipse 系中的 Project;
IntelliJ 系中的 Project 可以包含多个 Module;
Eclipse 系中的 Workspace 可以包含多个 Project
完成配置过后,会询问你是否在当前窗口打开工程,以实际情况选择。
到此,页首所有需求已经完成;
最后谨以此句送给大家:革命尚未成功,同志仍须努力!