TortoiseGit的密钥
我认为TortoiseGit最大的问题,就是在于它使用ppk密钥格式,而不是使用OpenSSH密钥格式。
因为linux系统是默认使用OpenSSH的,所以Git在基于命令行的时候是使用OpenSSH格式的密钥。
同理,gitolite这种服务器端程序使用的是OpenSSH格式的密钥。
所以,必须将原有的OpenSSH密钥转换成PPK密钥才能在TortoiseGit中使用。
在安装TortoiseGit的时候,你可以选择使用Putty还是OpenSSH作为SSH客户端。安装程序中说,Putty和Windows配合得更好。
如何选择?我分别给出它们的特点:
Putty
- Putty有GUI界面,可以通过配置sessions来访问不同的git服务器端口;
- Putty有GUI程序(Putty Key Generator)来生成密钥;
- 如果使用Putty作为SSH客户端,那么传输速度可能会比较慢(个人感觉,当然也有人和我有一样的感觉);
- Putty不能直接使用原有的OpenSSH密钥,必须将其转换成PPK密钥才行。
OpenSSH
- OpenSSH是Git命令行程序默认使用的SSH客户端程序;
- Git for Windows默认就包含了OpenSSH程序;
- 你可以利用已有的OpenSSH密钥,不用做转换(例如我原来用cygwin的时候积累了一堆OpenSSH密钥,现在只需要在~/.ssh下做一个符号链接就能用了);
- GitHub/bitbucket等Host使用的都是OpenSSH密钥;
- 大多数Linux发行版默认使用OpenSSH作为服务端;
- 你可以方便的使用命令行程序来实现自动化处理。
看完上面的特点,如果你还是选择了Putty作为客户端的话,那么需要转换原有的OpenSSH密钥(如果有的话);
如果你依然义无反顾选择了OpenSSH作为客户端的话,我相信你已经知道如何生成、修改、配置SSH了,看来我也不必罗嗦
转换OpenSSH密钥到ppk格式
可以使用TortoiseGit自带的Putty Key Generator来转换原来的OpenSSH密钥到ppk格式。
打开该程序,选择 Conversions->Import Key
命令将OpenSSH 私钥 导入界面中,然后点击 Save private key
按钮将密钥保存成ppk格式。建议在 Key comment
中输入说明,否则密钥多了很难分辨。至于密码,为了方便可以不设置。
生成OpenSSH和ppk格式的密钥
为了同时支持服务端和客户端,我们可以在生成一个密钥的时候,同时生成该密钥的ppk格式和OpenSSH格式。而每个密钥对都包含 公钥 和 私钥,两对一共是4个文件。这样就可以满足所有情况了。
打开Putty Key Generator,选择 Generator
按钮,晃动鼠标生成一个密钥,然后这样处理:
- 点击
Save private key
按钮将密钥保存成 ppk格式私钥; - 点击
Save public key
按钮将密钥保存成 ppk格式公钥; - 点击
Conversions->Export OpenSSH Key
按钮将密钥保存成 OpenSSH格式私钥; - 获取上图红框中的所有文本内容,粘贴到文本编辑软件中,保存为一个单行的文件,这就是OpenSSH格式公钥;
在TortoiseGit中使用SSH host
如果使用Putty作为TortoiseGit的SSH客户端,那么就不能使用OpenSSH的 ~/.ssh/config 来定义使用不同的端口和密钥访问SSH,而是需要使用 PuTTY Session。这篇文章进行了详细讲解:http://zengrong.net/post/1775.htm
换行符的问题 autocrlf and safecrlf
Windows(\r\n)、Linux(\n)和MacOS(\r)三个主流系统的换行符各不相同,这样在跨平台合作的时候就容易出现换行符的问题。
Git提供了 autocrlf
和 safecrlf
两个参数来解决这个问题。但这两个参数如果没用好,就会影响开发。
例如,出现这种情况:
A和B两个开发人员,A使用LF(\n)做换行符,B使用CRLF(\r\n)做换行符,且都没有开启 autocrlf
参数,那么A在迁出B的文件,并使用自己的编辑器打开之后就会发现,虽然没有对文件做任何修改,但它的状态是modified。这是由于A的编辑器自动将B的文件中的所有换行符替换成了(LF),这与版本库中的(CRLF)不同。
让我们来看看 autocrlf
参数的作用:
1 2 3 4 5 6 7 8 | # 签出时将换行符转换成CRLF,签入时转换回 LF。 git config --global core.autocrlf true #签出时不转换换行符,签入时转换回 LF git config --global core.autocrlf input #签出签入均不转换 git config --global core.autocrlf false |
这些选项在TorgoiseGit中也可以设置。
我的建议是在无论在什么系统下编程,都把所有人的编辑器的换行符模式设置成Unix格式,然后把autocrlf设置成false,这样一劳永逸。
毕竟除了Windows记事本这类软件外,已经很少有文本编辑器不支持换行符设置了。
如果你把换行符搞乱了,在一个文件中既包含windows风格的换行符也包含unix风格换行符,那么safecrlf
就可以发挥作用了:
1 2 3 4 5 6 7 8 | # 拒绝提交包含混合换行符的文件 git config --global core.safecrlf true # 允许提交包含混合换行符的文件 git config --global core.safecrlf false # 提交包含混合换行符的文件时候给出警示 git config --global core.safecrlf warn |
文件权限问题 755 and 664
我在Cygwin下以命令行的形式使用Git,同时也使用TortoiseGit。
在使用TortoiseGit签出使用cygwin提交的项目时,发现所有的文件权限都改变了:
1 2 3 4 | $ git diff diff --git a/launch4j/spritesheet_conterver.xml b/launch4j/spritesheet_conterver.xml old mode 100755 new mode 100644 |
这是因为msysgit是一个类Unix模拟器,需要拥有Unix形式的文件访问权限。而由于Windows的种种限制,信息不能复原,从而导致原来的755成644了。
解决方法:
1 2 | git config --global core.filemode false git config core.filemode false |
这个选择的在TortoiseGit中没有界面来设置,只能用命令行或者手动修改git配置文件。