GIT平台在OSChina中的搭建帮了我们很大的忙,但如何将本地GIT仓库上传至OSChina的远程仓库,相信这是一个艰难的坎,今天我就在此总结我的成功经验,帮助大家,共同学习。由于条件有限,我全部的编写上传都是手机完成的,包括这篇文章

GIT同步问题出现

我一直都在用AIDE编写一个安卓软件,从1.1版到2.2.2版一系列版本,都在本地仓库存储,突然有一天,我想找同学一起开发了,然后问题来了:怎样才能将代码共享完了还要有控制权,能够决定代码是否被采用?那就用github吧。由于github网站被墙,所以换用OSChina,同样的功能,而且是国内网站。

REMOTE仓库建立

在OSChina中建立一个开发组,再建立一个空项目,然后系统就为我分配一个SSH链接地址git@git.oschina.net:hele_two/Guass_Position,这样REMOTE仓库就建立了,不过它是空的。我要做的是将本地仓库推送至REMOTE端。首先就是要使得本地与远端能够通过SSH认证连接,这时我就需要SSH2密钥对。

SSH2密钥生成

为啥叫SSH2呢,这大家可以度娘一下,据说是SSH商业化和OpenSSH的纷争。实际上是RSA密钥对。
如果我用Linux生成SSH2密钥对,那再简单不过了,只需用ssh-keygen就可以生成。但别忘了我只有一部安卓手机。针对以上问题,我有以下几点思路:

  • 移植Linux中的ssh-keygen到手机中运行

在手机上装了busybox也依然没有相关命令,于是我在网上下了Linux版ssh-keygen放到系统bin以及xbin文件夹内,然后命令行运行,提示SegmentFault,可知Android虽然基于Linux内核,但还是有区别的。扑街!

  • 利用Python开发环境

据说Python有高移植性,恰巧手机先前搭建了SL4A集成环境,安装了Python3.3解释器,也有QPython集成开发环境,于是上网搜了下,确实有可能成功。有个包叫paramiko,有相关实现。先试了QPython的pipe install paramiko,结果人家服务器没有这种包;后又试了下载paramiko包,看了人家的README,结果还需要pycrypto包,于是又下载,但不知怎样安装,另外在shell中也无法找到python命令。总之问题很多,留下思考方向,去看看PATH变量,试试把python路径添加进去。有兴趣的可以试试,如果成功了记得分享一下哦。

  • 利用Java开发环境

手机中安装了AIDE,java环境跟电脑一样。上网搜索,找到符合条件的一种包——Jsch。不过据说这玩意很难找到参考手册,凭着锲而不舍的决心,我终于在CSDN上找到了,并花了2个豆下了下来。用CHM阅读器看下。。。。全是English?!还好我懂一些。。。。没有Demo,只能试。多的不说了,上代码:

JSch jsch = new JSch();
		try {
			KeyPair kp = new KeyPairRSA(jsch).genKeyPair(jsch,KeyPair.RSA);
			kp.writePrivateKey("/mnt/sdcard/.ssh/id_rsa");
			kp.writePublicKey("/mnt/sdcard/.ssh/id_rsa.pub", "hele-two@163.com");
		} catch (FileNotFoundException e) {
			System.out.println("haha");
		} catch (Exception e) {
			System.out.println("error");
		}

成功了!生成的格式很对。

打开公钥文件,CtrlC,到OSChina里CtrlV,Done!

CONFIG文件设置

Git问题再出现,在push过程中出现了rejected_nonfastforward错误,上网查了下,是因为remote端和local端分支不同步的原因。需要先pull再push。然后pull出现了branch.master.merge不知道地址的问题,这牵扯到默认地址和分支的问题。搜一下,remote端只有master分支,再在git的config文件添加如下代码:

[branch "master"]
	remote = master
	merge = refs/heads/master
[remote "master"]
	url = git@git.oschina.net:hele_two/Guass_Position
	fetch = refs/heads/master
[remote "origin"]
	url = git@git.oschina.net:hele_two/Guass_Position

再pull,可以了,然后push,也成功了。哦耶!

鸣谢