搭建git远程服务器

搭建git远程服务器

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


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

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

创建远程服务器

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

创建本地仓库

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

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

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

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

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

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

创建裸仓库

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

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

wangminli@debian:~$ git clone --bare gittest gittest.git
克隆到裸版本库 'gittest.git'...
完成。
wangminli@debian:~$ ls
gittest  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  refs

gittest.git/:
branches  config  description  HEAD  hooks  info  objects  packed-refs  refs

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

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

scp -r gittest.git root@115.28.86.226:gittest
wangminli@debian:~$ scp -r gittest.git root@115.28.86.226:gittest
root@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 ~]# ls
gittest 
.....
[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 status
fatal: 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 log
commit f331862e5ce318312448730612213ca36f897736
Author: 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 gittest1
wangminli@debian:~$ cd gittest1
wangminli@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$ ls
gittest
wangminli@debian:~/gittest1$ cd gittest
wangminli@debian:~/gittest1/gittest$ ls
initialized.txt

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

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

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

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

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

测试

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

wangminli@debian:~/gittest1/gittest$ git branch 
  master
* zhangsan
wangminli@debian:~/gittest1/gittest$ > zhangsan.txt
wangminli@debian:~/gittest1/gittest$ git add zhangsan.txt
wangminli@debian:~/gittest1/gittest$ git commit -m "zhangsan.txt"
[zhangsan 1ce074e] zhangsan.txt
 0 个文件被修改
 create mode 100644 zhangsan.txt
wangminli@debian:~/gittest1/gittest$ git status
# 位于分支 zhangsan
# 您的分支领先 'origin/zhangsan' 共 1 个提交。
#
无须提交(干净的工作区)
wangminli@debian:~/gittest1/gittest$ git push
root@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 -> zhangsan
wangminli@debian:~/gittest1/gittest$ 

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

wangminli@debian:~$ mkdir gittest2
wangminli@debian:~$ cd gittest2
wangminli@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$ ls
gittest
wangminli@debian:~/gittest2$ cd gittest/
wangminli@debian:~/gittest2/gittest$ ls
initialized.txt
wangminli@debian:~/gittest2/gittest$ git branch 
* master   # 默认显示的只有master分支
wangminli@debian:~/gittest2/gittest$ git checkout --track origin/zhangsan
Branch zhangsan set up to track remote branch zhangsan from origin.
切换到一个新分支 'zhangsan'
wangminli@debian:~/gittest2/gittest$ git branch 
  master
* zhangsan
wangminli@debian:~/gittest2/gittest$ ls
initialized.txt  zhangsan.txt  # zhangsan.txt出来了!
wangminli@debian:~/gittest2/gittest$ 

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

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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值