搭建git远程服务器

来源:互联网 发布:文明太空潮起mac 编辑:程序博客网 时间:2024/06/05 14:23

搭建git远程服务器

我的官方博客地址:www.wangminli.com


在公司里使用git进行代码管理,犯了很多错后,深深的体会到git的强大。尽管可以比较顺畅的使用git了,但也只停留在使用它提交代码上,并不了解git服务器是如何创建的,也不清楚本地分支是如何关联到远程分支的。这个疑问一只萦绕在心头,今天有空,决定将这一课补上。查找了一些资料后,有所收获,记录以备忘。

声明:这是我试用可行的一种方案,并没有系统的研究各种方案的可行性,如您有更好的方案,请告知,谢谢!

创建远程服务器

创建远程服务器的原理很简单,首先你要在本地有一个代码仓库,然后将这个仓库导出为一个“裸仓库”,最后将这个“裸仓库”推送到远程服务器就OK了。“裸仓库”听起来很玄乎,其实就是仅包含本地仓库中“.git”目录中的部分文件,不包含工作目录的仓库文件。git为我们提供了创建这个“裸仓库”的方法(git clone --bare *** ***)。

创建本地仓库

为方便测试,首先我们的本地要有一个代码仓库,我创建一个gittest的目录,并将其作为代码仓库。

wangminli@debian:~$ mkdir gittestwangminli@debian:~$ cd gittestwangminli@debian:~/gittest$ lswangminli@debian:~/gittest$ git init初始化空的 Git 版本库于 /home/wangminli/gittest/.git/

版本库创建完毕后,git会为我们自动创建一个默认分支master,我们可以使用命令git branch查看到这个分支。

wangminli@debian:~/gittest$ git branch * master

方便演示,我创建一个文件并提交。

wangminli@debian:~/gittest$ > initialized.txtwangminli@debian:~/gittest$ lsinitialized.txtwangminli@debian:~/gittest$ git add initialized.txtwangminli@debian:~/gittest$ git commit -m "initialized."[master(根提交) f331862] initialized.wangminli@debian:~/gittest$ git log --onelinef331862 initialized.

创建裸仓库

这时,我们简单演示了下git的基本操作,并有了一些基础文件,下面我们用它进行测试。

我们回到根目录下,使用命令git clone --bare gittest gittest.git

wangminli@debian:~$ git clone --bare gittest gittest.git克隆到裸版本库 'gittest.git'...完成。wangminli@debian:~$ lsgittest  gittest.git...

我们对比gittest.git(裸仓库)和gittest中的.git文件,发现除了少了几个文件外,其他并无二异,另外gittest.git中并不包含gittest中的工作目录,既工作区的代码。

wangminli@debian:~$ ls gittest.git/ gittest/.git/gittest/.git/:branches  COMMIT_EDITMSG  config  description  HEAD  hooks  index  info  logs  objects  refsgittest.git/:branches  config  description  HEAD  hooks  info  objects  packed-refs  refs

将裸仓库推送到远程服务器

基础准备已经做好了,下面我们将这个“裸仓库”推送到远程服务器一个指定位置。

scp -r gittest.git root@115.28.86.226:gittestwangminli@debian:~$ scp -r gittest.git root@115.28.86.226:gittestroot@115.28.86.226's password: HEAD                                                                                                                        100%   23     0.0KB/s   00:00    prepare-commit-msg.sample                                                                                                   100% 1239     1.2KB/s   00:00    update.sample                                                                                                               100% 3611     3.5KB/s   00:00    pre-rebase.sample                                                                                                           100% 4898     4.8KB/s   00:00    pre-applypatch.sample                                                                                                       100%  398     0.4KB/s   00:00    applypatch-msg.sample                                                                                                       100%  452     0.4KB/s   00:00    commit-msg.sample                                                                                                           100%  896     0.9KB/s   00:00    pre-commit.sample                                                                                                           100% 1704     1.7KB/s   00:00    post-update.sample                                                                                                          100%  189     0.2KB/s   00:00    packed-refs                                                                                                                 100%   85     0.1KB/s   00:00    description                                                                                                                 100%   73     0.1KB/s   00:00    9de29bb2d1d6434b8b29ae775ad8c2e48c5391                                                                                      100%   15     0.0KB/s   00:00    c7c176e2f6069320b1e685e1d35c89f6f774ec                                                                                      100%   60     0.1KB/s   00:00    31862e5ce318312448730612213ca36f897736                                                                                      100%  126     0.1KB/s   00:00    config                                                                                                                      100%  115     0.1KB/s   00:00    exclude                                                                                                                     100%  240     0.2KB/s   00:00    wangminli@debian:~$ 

注意,远程服务器最初可以没有gittest目录,scp命令会自动创建没有该目录的目录。 下面我们登录远程服务器查看git服务器是否创建。

[root@Debian ~]# lsgittest .....[root@Debian ~]# 

你会发现,创建的目录名字是“gittest”,而不是“gittest.git“。这时,本地gittest.git中的文件已在gittest目录中了。

[root@Debian ~]# ls gittest/branches  config  description  HEAD  hooks  info  objects  packed-refs  refs[root@Debian ~]#

我们还会发现,使用git的一些常用命令无效了,就向上面提到的,因为它并不包含git的工作目录。

[root@Debian ~]# cd gittest/[root@Debian gittest]# git statusfatal: This operation must be run in a work tree[root@Debian gittest]# git branches/git: 'branches/' is not a git command. See 'git --help'.[root@Debian gittest]# git branch* master[root@Debian gittest]# git logcommit f331862e5ce318312448730612213ca36f897736Author: wangminli <wongminli@163.com>Date:   Mon Oct 27 11:35:35 2014 +0800    initialized.

至此,远程git服务器已经创建好了! 不过,为了更好的使用远程git服务器,我们还需要进行一些必要设置,如创建远程分支等。

推送并关联远程分支

跟理解有所出入的是,远程分支并不是在远程git服务器上创建的,而是以在本地基于一个提交(或分支)推送一个远程分支的形式间接创建的,说白了就是推送一个已有分支,在推送的同时指定一个远程分支名字,推送成功后,远程分支也就创建了,如“git push origin master:zhangsan”。 另外,如果我们在本地创建一个分支,在不进行其他配置的情况下,是不会与远程分支建立关联的,因为它找不到需要关联的远程分支嘛。一个远程分远程分支可以在原有提交上创建,也可以在原有分支上创建。

还需要注意的一点是,我们刚才创建的gitdemo仓库因为没有与远程建立关联,无法直接推送和拉取,索性我们不需要它了,直接通过克隆(clone)远程上的分支建立本地与远程的关联,克隆的仓库已与远程分支自动建立关联。

下面进行演示,我们创建一个gittest1目录,并克隆远程分支

wangminli@debian:~$ mkdir gittest1wangminli@debian:~$ cd gittest1wangminli@debian:~/gittest1$ git clone root@115.28.86.226:gittest正克隆到 'gittest'...root@115.28.86.226's password: remote: Counting objects: 3, done.Receiving objects: 100% (3/3), 215 bytes, done.remote: Total 3 (delta 0), reused 0 (delta 0)wangminli@debian:~/gittest1$ lsgittestwangminli@debian:~/gittest1$ cd gittestwangminli@debian:~/gittest1/gittest$ lsinitialized.txt

我们发现,我们之前创建的initialized.txt已经克隆到了我们新的仓库下! 下面我们创建一个远程分支,供用户zhangsan使用。

wangminli@debian:~/gittest1/gittest$ git branch * masterwangminli@debian:~/gittest1/gittest$ git push origin master:zhangsanroot@115.28.86.226's password: Total 0 (delta 0), reused 0 (delta 0)To root@115.28.86.226:gittest * [new branch]      master -> zhangsanwangminli@debian:~/gittest1/gittest$ git branch * master

origin是我们远程git服务器的名字。 我们推送一个远程分支zhagnsan上去,并且注意到,本地并没有zhangsan分支。 我们可以在本地手动创建zhagnsan分支,并与远程的zhangsan分支建立关联,但有简便方法将这两步合为一步,那就是“检出”(checkout)操作,我们检出zhangsan分支并跟踪这个远程分支即可。 实现方式是将远程的zhangsan检出的同时跟踪(track)这个分支就可以了。

wangminli@debian:~/gittest1/gittest$ git checkout --track origin/zhangsanBranch zhangsan set up to track remote branch zhangsan from origin.切换到一个新分支 'zhangsan'wangminli@debian:~/gittest1/gittest$ git branch   master* zhangsanwangminli@debian:~/gittest1/gittest$ 

执行速度非常快,我们推测,远程zhagnsan分支在本地也是存在的,只是我们没有配置,所以它并没有显现出来。 好了,我们在本地也创建了一个分支上去。

测试

下面我们在zhangsan分支上提交文件,并推送(push)测试一下。

wangminli@debian:~/gittest1/gittest$ git branch   master* zhangsanwangminli@debian:~/gittest1/gittest$ > zhangsan.txtwangminli@debian:~/gittest1/gittest$ git add zhangsan.txtwangminli@debian:~/gittest1/gittest$ git commit -m "zhangsan.txt"[zhangsan 1ce074e] zhangsan.txt 0 个文件被修改 create mode 100644 zhangsan.txtwangminli@debian:~/gittest1/gittest$ git status# 位于分支 zhangsan# 您的分支领先 'origin/zhangsan' 共 1 个提交。#无须提交(干净的工作区)wangminli@debian:~/gittest1/gittest$ git pushroot@115.28.86.226's password: Counting objects: 3, done.Delta compression using up to 2 threads.Compressing objects: 100% (2/2), done.Writing objects: 100% (2/2), 250 bytes, done.Total 2 (delta 0), reused 0 (delta 0)To root@115.28.86.226:gittest   f331862..1ce074e  zhangsan -> zhangsanwangminli@debian:~/gittest1/gittest$ 

可以看出我们推送(push)成功了。 为了能看到效果,我们再克隆一下这个版本库,看看zhangsan.txt是否在zhangsan分支下。

wangminli@debian:~$ mkdir gittest2wangminli@debian:~$ cd gittest2wangminli@debian:~/gittest2$ git  clone root@115.28.86.226:gittest正克隆到 'gittest'...root@115.28.86.226's password: remote: Counting objects: 5, done.remote: Compressing objects: 100% (3/3), done.Receiving objects: 100% (5/5), 434 bytes, done.remote: Total 5 (delta 0), reused 0 (delta 0)wangminli@debian:~/gittest2$ lsgittestwangminli@debian:~/gittest2$ cd gittest/wangminli@debian:~/gittest2/gittest$ lsinitialized.txtwangminli@debian:~/gittest2/gittest$ git branch * master   # 默认显示的只有master分支wangminli@debian:~/gittest2/gittest$ git checkout --track origin/zhangsanBranch zhangsan set up to track remote branch zhangsan from origin.切换到一个新分支 'zhangsan'wangminli@debian:~/gittest2/gittest$ git branch   master* zhangsanwangminli@debian:~/gittest2/gittest$ lsinitialized.txt  zhangsan.txt  # zhangsan.txt出来了!wangminli@debian:~/gittest2/gittest$ 

至此,一个简单的git服务器搭建完成了,可以在上面进行一些复杂的操作了。

当然,对git服务器的搭建还远不止这些,还有更多的知识等待我们研究使用。

0 0
原创粉丝点击