VMware, Win7, Mac系统之间使用Git版本控制器的解决方案
前一阵子折腾了一阵子Git,用于在Mac系统和Windows系统之间进行代码同步:使用Git在Mac和Windows系统之间进行同步数据
不过当时只是权宜之计,能让我从PC上更新Mac的代码和从Mac上更新PC的代码。
现在新的需求出现了,我们有三种系统,苹果机器上的Mac OS X, Win7宿主机器上VMWare里面的Mac OS X以及Windows 7,代码仓库放在专门的服务器上。经过无数次的尝试,发现无法在VMWare里面的Mac OS X系统里面访问其他的Windows 7共享文件夹(可以ping通其他的Windows 7机器,就是Connect to Server不行,有哪位兄弟知道如何解决的麻烦指点一下),但是VMWare里面的Mac OS X可以和其他的苹果机器上的Mac OS X进行共享。Windows 7上可以访问Mac OS X的共享文件夹,但是push会失败。
在种种问题下,我决定花时间弄一弄通过ssh访问git的方式:
首先是服务器的问题,我们的服务器是Windows 7系统,默认没有ssh服务,所以需要单独安装:
google一番以后,找到两篇文章:
http://samwong.iteye.com/blog/986115
http://www.iteye.com/topic/690683
- 下载安装Git Extensions.(下载地址:http://code.google.com/p/gitextensions/),我用的版本是2.24,默认安装在C:\Program Files\Git下面,可以改成其他地方(对应的后面用到这个的地方也需要改)
- 右键"我的电脑",选择"属性",在左边列表里面选择"高级系统设置",点击"环境变量",在Path里面添加"C:\Program Files\Git\Bin"
- 下载安装CopSSH.(下载地址:http://www.itefix.no/i2/copssh),我用的版本是:4.1.0,默认是安装在C:\Program Files\ICW下面,可以改成其他地方(对应的后面用到这个的地方也需要改)
- 在服务器上创建一个新的Windows帐户名字叫做git,拥有管理员权限.(用户名可以改成其他的,只要你愿意)
- 点击“开始菜单”->"所有程序"->"Copssh"->"01. COPSSH Control Panel"
点击"Add"开始添加用户
点击"Forward"进入下一个页面- 选择刚刚创建的git用户(如果你的不是git用户,请选择你的用户名)
然后点击"Forward"会自动跳到激活用户页面
继续点击"Forward"- 激活确认页面,点击"Apply"
- 在"开始"里面输入cmd<回车>,打开命令行窗口,输入如下命令:ssh git@127.0.0.1,然后应该就能看到提示让你输入密码,密码确认成功以后就可以看到下面的画面了
- 控制面板中选择Windows防火墙,点击左边的"高级设置",在左边列表中选择"入站规则",然后点击右边的"新规则"
选择端口,然后点击"下一步" - 输入端口号22,然后点击下一步
- 选择"允许所有连接",点击"下一步"
- 根据需要选择你要的访问范围,然后点击"下一步"
- 给新规则输入一个名字,然后点击"完成"
这样你就可以从其他机器通过SSH访问这台服务器了 - 配置SSH里面的Git
- 点击"开始"->"All Programs"->"Copssh"->"02. Start a Unix BASH Shell"
- 运行命令: cd /Bin
- 输入下面4条命令创建4个符号链接:
$ ln -s /cygdrive/c/git/bin/git.exe git.exe
$ ln -s /cygdrive/c/git/libexec/git-core/git-receive-pack.exe git-receive-pack.exe
$ ln -s /cygdrive/c/git/libexec/git-core/git-upload-archive.exe git-upload-archive.exe
$ ln -s /cygdrive/c/git/libexec/git-core/git-upload-pack.exe git-upload-pack.exe - 这样你就可以在ssh登陆以后调用git了 (把c/git换成你的git安装所在目录, 比如d:\Program Files\Git,就换成d/Program~1/Git)
- 在服务器上创建Git仓库,通过调用命令git --bare init或者通过Git Extensions的GUI界面来初始化一个中央数据仓库,比如D:\Projects\Test
- 命令行下面调用命令: mklink /D "C:\Program Files\ICW\home\git\Projects" "D:\Projects"来创建一个目录的软链接(前面一个路径是CopSSH的安装路径下面之前创建的用户的home目录)
- 至此,服务器配置完成
- 客户端访问服务器时,URL为 git@xxx.xxx.xxx.xxx:~/Projects/Test,其中用户名和ip根据你的情况来定
- Clone的时候没发现问题,但是客户端push的时候发现会抱错:
git: '~/Projects/Test' is not a git command See 'git --help'.
fatal: The remote end hung up unexpectedly
找了半天,最后解决方法:在客户端运行下面命令:git config --global remote.origin.receivepack "git receive-pack",或者每次push的时候加上参数 --receive-pack='git receive-pack' (参考:http://stackoverflow.com/questions/2736862/git-clone-works-remote-push-doesnt-remote-repository-over-copssh) - 另外,在Mac系统里面我们使用的是SmartGit客户端,需要修改一下ssh设置,点击"Preferences"->"Git"->"SSH Client",选择"Use SmartGit as SSH client",否则会报告连接错误