您的位置:首页 > 运维架构 > Linux

Linux下安装操作Git远程仓库与本地仓库同步的教程

2016-08-17 14:59 609 查看
———————————————————————————————————————

[b]主机操作系统:Centos 6.7
[/b]

安装配置:GIT
邮箱:leiyuxing205@gmail.com
———————————————————————————————————————
一GIT简介

Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码版本控制软件

Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得
BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了
Git。例如最近就迁移到 Git 上来了,很多 Freedesktop 的项目也迁移到了 Git 上。

二.特点

分布式和集中式的最大区别在于开发者可以本地提交。每个开发者机器上都有一个服务器的数据库。

下图是经典的git开发过程。

Git的功能特性:

从一般开发者的角度来看git有以下功能:

1:从服务器上克隆数据库(包括代码和版本信息)到单机上。

2:在自己的机器上创建分支,修改代码。

3:在单机上自己创建的分支上提交代码。

4:在单机上合并分支。

5:新建一个分支,把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。

6:生成补丁(patch),把补丁发送给主开发者。

7:看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。

8:一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
三.功能

从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:

1:查看邮件或者通过其它方式查看一般开发者的提交状态。

2:打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。

3:向公共服务器提交结果,然后通知所有开发人员。

优点:

适合分布式开发,强调个体。

公共服务器压力和数据量都不会太大。

速度快、灵活。

任意两个开发者之间可以很容易的解决冲突。

离线工作。

缺点:

资料少(起码中文资料很少)。

学习周期相对而言比较长。

不符合常规思维

代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

四 新加用户git,该用户将作为所有代码仓库和用户权限的管理者:


[leiyuxing@centos6 ~]$ sudo useradd -m git

[leiyuxing@centos6 ~]$ sudo passwd git

更改用户 git 的密码 。

新的 密码:

重新输入新的 密码:

passwd: 所有的身份验证令牌已经成功更新。

五.切换到git用户,并初始化git帐户信息:

[leiyuxing@centos6 ~]$ su git

密码:

[git@centos6 leiyuxing]$cd

[git@centos6 ~]$ git config --global user.name "git"

[git@centos6 ~]$ git config --global user.email
"git@email.com"


六.修改/etc/sudoers文件,把git用户添加到sudo里去,方便使用sudo管理:

[leiyuxing@centos6 ~]$ sudo vim /etc/sudoers

****

git   ALL= NOPASSWD: ALL

****

七. 配置ssh公钥访问oschina:

oschina简介:

开源中国社区成立于2008年8月,其目的是为中国的IT技术人员提供一个全面的、快捷更新的用来检索开源软件以及交流使用开源经验的平台,目前开源中国社区已收录超过两万多款开源软件。 经过不断的改进,目前开源中国社区已经形成了由开源软件库、代码分享、资讯、讨论区和博客等几大频道内容。

中文名
开源中国社区
外文名
oschina.net
成    立
2008年8月
目    的
提供检索开源软件及交流
频    道
开源软件库、代码分享、资讯
对    象
中国的IT技术人员



ssh公钥:

---------------------------------------

大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供

一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。

首先先确认一下是否已经有一个公钥了。SSH 公钥默认储存在账户的主目录下的 ~/.ssh

目录。关键是看有没有用 something 和 something.pub 来命名的一对文件,这个 something

通常就是 id_dsa 或 id_rsa。有 .pub 后缀的文件就是公钥,另一个文件则是密钥。假如没有这些文件,或者干脆连 .ssh 目录都没有,可以用 ssh-keygen 来创建。该程序在

---------------------------------------

 转到.ssh目录下(若没有则新建一个),生成的公钥将放到该目录下

[leiyuxing@centos6 git]$ cd ~/.ssh/

使用ssh-kengen工具生成公钥(public key):
[leiyuxing@centos6 .ssh]$ ssh-keygen -t rsa -C"674116231@qq.com"  //Creates a new ssh key using the provided email,"674116231@qq.com"是您注册时使用的邮箱名,注意会弹出要输入文件名及密码等,直接敲Enter即可。

Generating public/private rsa key pair.

Enter file in which to save the key (/home/leiyuxing/.ssh/id_rsa): 

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 

Your identification has been saved in /home/leiyuxing/.ssh/id_rsa.

Your public key has been saved in /home/leiyuxing/.ssh/id_rsa.pub.

The key fingerprint is:

99:7b:20:40:dc:d4:09:4a:68:a3:88:87:d2:ca:da:d7 674116231@qq.com

The key's randomart image is:

+--[ RSA 2048]----+

|   ooooo .       |

|  +o... o        |

|o= .o            |

|* o  .   o       |

|oo    . S        |

|..     . o       |

|..   .  . .      |

|. . . E  .       |

|   .             |

+-----------------+


查看生成的公钥,并将公钥内容拷贝添加到Git @ OSC http://git.oschina.net/keys



[leiyuxing@centos6 .ssh]$ cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQ..........................................................................................................................................................................................................


PzARbyLiutwEAblSx4zy01WT8Xjdxz0jAPSZo3vGppLb1P0o2GpGfHOhuU5SAaoBVsA/30s5X9MbvLxuznyUqAf7WckX34ztT9thMgw== 674116231@qq.com

[leiyuxing@centos6 .ssh]$ ls

id_rsa  id_rsa.pub  known_hosts


注意拷贝过程中不能多一个空格,也不能少一个空格,格式等必须和生成的公钥一致(不要用Windows自带的记事本打开复制)。

通过如下的命令可以查看是否设置公钥成功:
[leiyuxing@centos6 .ssh]$ ssh -T git@git.oschina.net
Welcome to Git@OSC, leiyuxing!

八.创建git存放代码的仓库:

如图我用osc托管的,我就先在那上面建立了一个新的项目,里面除了一个readme什么都没有。






 其中以下网址是用来连接的:






接下来就回到我们虚拟机上:

[leiyuxing@centos6 ~]$ mkdir git

[leiyuxing@centos6 ~]$ cd git/

[leiyuxing@centos6 git]$ git init

Initialized empty Git repository in /home/leiyuxing/git/.git/

首先是建立我们本地一个git目录,然后git init使它真正成为一个仓库,会出现一个.git目前,仓库的属性都在里面,它就是一个标志,有它就是一个git仓库

建立联系:

[leiyuxing@centos6 ~]$ git remote add origin git@git.oschina.net:LYX_WIN/OV9650.git

[leiyuxing@centos6 ~]$ git remote -v

origin  git@git.oschina.net:LYX_WIN/OV9650.git (fetch)

origin  git@git.oschina.net:LYX_WIN/OV9650.git (push)

可以用pull把我们远处仓库的文件下下来(刚才我们上面建立了联系,所示我们可以用这个命令:git pull origin master)

[leiyuxing@centos6 git]$ git pull git@git.oschina.net:LYX_WIN/OV9650.git

remote: Counting objects: 3, done.

remote: Total 3 (delta 0), reused 0 (delta 0)

Unpacking objects: 100% (3/3), done.

From git.oschina.net:LYX_WIN/OV9650

 * branch            HEAD       -> FETCH_HEAD


[leiyuxing@centos6 git]$ ls

README.md

我们想做的是如何把自己仓库的文件放到远程仓库中呢?

首先我创建一个文件,然后用命令加入到我本地的仓库中去

[leiyuxing@centos6 git]$ vim a.txt

[leiyuxing@centos6 git]$ cat a.txt

aaa

[leiyuxing@centos6 git]$ git status

# On branch master

# Untracked files:

#   (use "git add <file>..." to include in what will be committed)

#

#       .a.txt.swp

#       a.txt

nothing added to commit but untracked files present (use "git add" to track)


这时会提示我们有一个未追踪的文件,叫a.txt。我们要把这个文件加入到版本控制中,于是,我们运行如下命令:

[leiyuxing@centos6 git]$ git add a.txt

这个命令表示把我们指定的a.txt加入到git控制之下。add命令可以没有参数(在windows下可以没有参数,在mac下需要指定当前目录即“.”),如果没有参数,则表示把目录下的所有文件都加入到git仓库中。这个时候,我们再运行下“git status”:

[leiyuxing@centos6 git]$ git status

# On branch master

# Changes to be committed:

#   (use "git reset HEAD <file>..." to unstage)

#

#       new file:   a.txt

#

# Untracked files:

#   (use "git add <file>..." to include in what will be committed)

#

#       .a.txt.swp


提示我们有改变需要被提交。这个时候,a.txt这个文件就存在于所谓的“暂存区”中,暂存区中的文件可以被真正提交到git仓库。有同学可能说,如果我不想提交这个文件了,那怎么把刚才的文件从暂存区移除呢?其实答案就在刚才的提示中:

use "git rm --cached ..." to unstage。

那么,我们运行下这个命令:


[leiyuxing@centos6 git]$ git rm --cached a.txt

rm 'a.txt'
再运行git status时就可以发现,又回到文件没有被提交时的状态了。


 

当我们的文件已经通过“git add”加入到暂存区后,就可以把文件真正提交到git仓库了。如下:

[leiyuxing@centos6 git]$ git commit -m "add a file"

[master 284a63b] add a file

 1 files changed, 1 insertions(+), 0 deletions(-)

 create mode 100644 a.txt


[leiyuxing@centos6 git]$ git push -f git@git.oschina.net:LYX_WIN/OV9650.git

Counting objects: 4, done.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 271 bytes, done.

Total 3 (delta 0), reused 0 (delta 0)

To git@git.oschina.net:LYX_WIN/OV9650.git

   a97700d..284a63b  master -> master


发现已经可以提交成功了,提示一个文件被修改(就是我们的a.txt),一行被插入(就是我们唯一的一行“aaa”)。

我们再运行下git status:

[leiyuxing@centos6 git]$ git status

# On branch master

nothing to commit (working directory clean)

提示我们当前没有东西要提交,当前工作目录是干净的,因为我们都提交到git了。

好了,到这步后,git就可以完全跟踪已经被提交的文件了,以后,这个文件的任何修改,它都可以记录下来。比如某个人对项目私自修改了一些东西,项目管理者根据git的版本记录是一定可以找到是谁修改了哪些文件的。

现在我们就可以把文件提交到远程服务器了。


我们也可以刷新网页,在我们的osc上看到了:






九.这次我们尝试不用自己创建仓库了,直接用 clone命令

[leiyuxing@centos6 git]$ git clone git@git.oschina.net:LYX_WIN/OV9650.git
Initialized empty Git repository in /home/leiyuxing/git/OV9650/.git/
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
[leiyuxing@centos6 git]$ ls
a.txt  OV9650  README.md

我们进去ov9650这个目录可以看见.git这个目录:

[leiyuxing@centos6 OV9650]$ ls ../  .git
../:
a.txt  OV9650  README.md
.git:
branches  description  hooks  info  objects      refs
config    HEAD         index  logs  packed-refs
我们git log可以看见我们在1.3服务器上做的事情,说明就是那个仓库:

[leiyuxing@centos6 OV9650]$ git log
commit 284a63b496f11bd7949bcf3a1d3d0ee70b716409
Author: leiyuxing <674116231@qq.com>
Date:   Thu Aug 18 08:34:06 2016 +0800
   add a file
commit a97700d366d8703cbfbcc109862c0b9781733834
Author: leiyuxing <674116231@qq.com>
Date:   Wed Aug 17 10:42:17 2016 +0800
       Initial commit

然后可以测试一下,创建一个1.c文件然后上传:

[leiyuxing@centos6
OV9650]$ touch 1.c

[leiyuxing@centos6 OV9650]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       1.c
nothing added to commit but untracked files present (use "git add" to track)
[leiyuxing@centos6 OV9650]$ git add 1.c 

[leiyuxing@centos6 OV9650]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   1.c
#
[leiyuxing@centos6 OV9650]$ git commit -m "add a file"
[master 8ce8431] add a file
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 1.c
[leiyuxing@centos6 OV9650]$ git push -f git@git.oschina.net:LYX_WIN/OV9650.git
Counting objects: 8, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 708 bytes, done.
Total 7 (delta 0), reused 0 (delta 0)
To git@git.oschina.net:LYX_WIN/OV9650.git
   284a63b..8ce8431  master -> master

我们可以再一次刷新网页,在我们的osc上看到了:





 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息