本实验使用的是实体机 ubuntu 16.04 和虚拟机 virtualbox 搭建 ubuntu—server 16.04 系统进行连接,其中用 ubuntu-server 搭建 git,实体机 ubuntu desktop 连接 ubuntu-server,后续如果有其他环境也会逐一补充。

这边暂时没有在实体机上面尝试,先列举出在虚拟机上面架设 git 服务器

使用 ssh 登陆 ubuntu-server

ping 通两个系统:

看是否可以 ping 通两个系统,首先查看 ip 地址,ifconfig, 例如主机是: 192.168.18.60 ,虚拟机是 192.168.18.202。则在主机中 ping 192.168.18.60 ,当然事情往往并不会一帆风顺,很多设置的时候,为了可以链接外网,虚拟机选用了 NAT 模式。貌似该模式无法使用ssh服务,虚拟机可以 ping 通主机,但主机无法 ping 通虚拟机。这时候可以使用几种方法:

  • 更改虚拟机模式为桥接模式,弃用原来的 NAT 模式。
  • 使用实体机中的虚拟机网卡与虚拟机进行交互,但貌似 ubuntu 下面并无法找到这块虚拟网卡,解决办法可以手动建立一个虚拟网卡。
  • 创建一个新的链接方式,通过这个桥接到实体机,然后通过 NAT 访问外网。这边详细介绍这种方式

详细步骤:

  • 使用 virtualbox 新建一个新的 adapter,选用 bridge adapter。如下图:

  • 重启虚拟机系统,或者重启网络服务 sudo /etc/init.d/networking restart ,ifconfig -a 查看所有网卡,可以看到虚拟机中有一个网卡 enp0s8 并没有被使用,这个就是刚刚新建的那个桥接网卡。
  • 设置该网卡,修改/etc/network/interfaces文件,如下图:

  • 重启网络服务 sudo /etc/init.d/networking restart,ifconfig 查看网卡。如下图:
    -

  • 接着基本就可以尝试 ping 通两个系统了,实体机中使用 ping 192.168.18.202,虚拟机中 ping 192.168.18.60 。如果仍然不行可以尝试关闭防火墙:sudo ufw disable

尝试ssh服务:

本步骤主要是建立链接,安装 ssh 服务,然后连接实体机可以登陆 ubuntu-server。因为这边 git 采用了 ssh 与服务器进行交互,所以 ssh 在这边是必须的。

  • 实体机和虚拟机,两个操作系统必须要同时安装 ssh 服务,如果只有实体机安装会出现链接失败。安装指令都是: sudo apt-get install ssh或sudo apt-get install openssh-serversudo /etc/init.d/ssh restart 重启 ssh 服务。
  • 查看ssh服务是否启动, ps –e | grep ssh,响应的 sshd 和 ssh-agent 如果未打开则运行指令名字。
  • 修改实体机的 ip 配置文件 /ect/hosts,加入如下行: 192.168.18.202 ubuntu_server,ubuntu_server 是你的虚拟机的主机名称,而 ubuntu_server 以后将代替 192.168.18.202 出现。如果你的虚拟机名不是 ubuntu_server ,可以修改 /etc/hostname 中的名称。
  • 通过以上设置后,你的主机基本可以通过 ssh 访问虚拟机了,你可以在虚拟机新建一个用户 adduser git,然后实体机可以使用如下命令 ssh git@ubuntu_server 或者 ssh [email protected] 进行登陆,输入密码就可以进行相关操作了。

补充:如果 ssh 还不能登录上,就修改 sshd 的默认配置,例如: ssh 出现 permission denied (publickey) 问题:

1
2
3
4
5
修改 /etc/ssh/sshd-config 文件.
将其中的 PermitRootLogin no 修改为 yes
PubkeyAuthentication yes 修改为 no
AuthorizedKeysFile .ssh/authorized_keys 前面加上#屏蔽掉,
PasswordAuthentication no 修改为 yes 就可以了。*

git虚拟服务器搭建:

安装 git,可以使用命令 sudo apt-get install git-core 或者 `sudo apt-get install git` 。

  • 在实体机上,我们使用命令: ssh-keygen –t rsa 生成密钥。秘钥在当前用户目录的 .ssh 目录下。
  • 在虚拟机的 git 目录下新建一个 .ssh 目录
  • 在 .ssh 目录下,我们可以看到 id_rsa 和 id_rsa.pub 文件,id_rsa.pub 为公钥,我们 通过命令 scp /home/git/.ssh/id_rsa.pub git@ubuntu_server:/home/git/.ssh/authorized_keys将实体机上生成的公钥拷贝到虚拟机的git账户目录下上。如果是要添加公钥可以使用使用命令 cat /home/git/id_rsa.pub>>/home/git/.ssh/authorized_keys
  • 使用命令 git –-bare init /home/git/myRep.git ,初始化化仓库。注意一定需要建立一个 –bare 的裸库。

git操作

我们可以使用 git clone git@gitServer:/home/git/myRep.git 直接将库克隆下来,但一般推荐,在将本地库与远程库建立链接具体步骤如下:

  • 在实体机中新建一个文件夹, mkdir test ,进入该文件夹 cd test
  • 初始化这个库, git init
  • 随意添加几个文件,例如: echo "hello world" >> test.txt
  • 常规git操作,加入stage并提交, git add . && git commit -m "test"
  • 查看下本地库的状态: git status
  • 一切正常的话,将远程库与本地库建立关系: git remote add test git@ubuntu_server:/home/git/myRep.git。这边的 test 为远程库的名称,默认一般为 origin,但如果你一个项目中同时有多个库,则建议你修改 origin 名称。
  • git remote –v,可查看版本库的网址,以及相关的库名称

  • 可以通过 git push test master 进行推送,注意这边远程库名为test而并不是默认的origin。也可以通过git pull test master对虚拟机中的远程库进行拉取。注意因为不是默认名称,所以直接使用 git push 或者 pull 会报错。

注意严格按照上面步骤执行,git 操作,一步错,可能就需要你删除 .git 以及 git remote remove test 等相关系列的操作,或者可以删除整个目录重新开始。值得注意的是, git 建立出来的每个库是相互独立的,除非全局设置,否则在添加远程库或者修改其他设置时,都不会对其他库有任何影响。

建立好库,并且也 push 等操作都成功了,但查看虚拟机中远程库的源文件却发现招不到任何一个文件,事实上, git 远程裸库仅仅保存修改记录和分支,并不是用来查看的,只有当你 clone 或者 pull 之后才可以查看某条分支的完整结构。

参考链接:
http://developer.51cto.com/art/201507/483448.htm
http://blog.sina.com.cn/s/blog_6ab9984801011k81.html
http://stackoverflow.com/questions/20252294/ssh-could-not-resolve-hostname-hostname-nodename-nor-servname-provided-or-n
http://www.cnblogs.com/xdzone/archive/2011/03/09/1978327.html
http://blog.csdn.net/zht666/article/details/9340633
http://blog.sina.com.cn/s/blog_5f435c130102v6pv.html
http://bbs.csdn.net/topics/390158779
http://blog.163.com/danshiming@126/blog/static/109412748201251211140194/