Git 的使用

 

SVN与Git的最主要的区别?

      SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

      Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

 

Git基本常用命令如下:

   mkdir:         XX (创建一个空目录 XX指目录名)

   pwd:          显示当前目录的路径。

   git init          把当前的目录变成可以管理的git仓库,生成隐藏.git文件。

   git add XX       把xx文件添加到暂存区去。

   git commit –m “XX”  提交文件 –m 后面的是注释。

   git status        查看仓库状态

   git diff  XX      查看XX文件修改了那些内容

   git log          查看历史记录

   git reset  –hard HEAD^ 或者 git reset  –hard HEAD~ 回退到上一个版本

                        (如果想回退到100个版本,使用git reset –hard HEAD~100 )

   cat XX         查看XX文件内容

   git reflog       查看历史记录的版本号id

   git checkout — XX  把XX文件在工作区的修改全部撤销。

   git rm XX          删除XX文件

   git remote add origin https://github.com/tugenhua0707/testgit 关联一个远程库

   git push –u(第一次要用-u 以后不需要) origin master 把当前master分支推送到远程库

   git clone https://github.com/tugenhua0707/testgit  从远程库中克隆

   git checkout –b dev  创建dev分支 并切换到dev分支上

   git branch  查看当前所有的分支

   git checkout master 切换回master分支

   git merge dev    在当前的分支上合并dev分支

   git branch –d dev 删除dev分支

   git branch name  创建分支

   git stash 把当前的工作隐藏起来 等以后恢复现场后继续工作

   git stash list 查看所有被隐藏的文件列表

   git stash apply 恢复被隐藏的文件,但是内容不删除

   git stash drop 删除文件

   git stash pop 恢复文件的同时 也删除文件

   git remote 查看远程库的信息

   git remote –v 查看远程库的详细信息

   git push origin master  Git会把master分支推送到远程库对应的远程分支上

 

参考资料:http://blog.jobbole.com/78960/

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

git的server的搭建方式大致几种:

1、基于git daemon搭建,这种方式配置还比较简单,但是貌似对身份认证支持不好。

2、ssh方式,这种方式就是需要在server上加真实用户,对于我来说,觉得不太爽。

3、http方式,简单方便,但是我不想再装个apache了。

4、使用gitosis/gitolite搭建,这种方式搭建、配置过程会复杂一些,但是功能强大(功能上gitolite更丰富一些,

   并且考虑到gitosis有1年多没有更新了,于是决定使用gitolite)

首先创建一个裸仓库

服务器端:

#cd /opt/git

#mkdir project.git

#cd project.git

#git --bare init

用户连接git server有两种方式:

client1:

#git clone gitserver:/opt/git/project.git

#cd project

#touch README

#git commit -am 'fix for the README file'

#git push origin master(上传)

#git pull origin master(下载)

client2:

#cd myproject

#git init

#touch README

#git add .

#git commit -m 'initial commit'

#git remote add origin git@gitserver:/opt/git/project.git

#git push origin master(上传)

#git pull origin master(下载)

作为一个额外的防范措施,你可以用Git自带的git-shell工具限制git用户的活动范围。只要把它设为git用户登入的shell,

那么该用户就无法使用普通的bash或者csh什么的shell程序。编辑/etc/passwd文件:

#vim /etc/passwd

在文件末尾,你应该能找到类似这样的行:

git:x:1000:1000::/home/git:/bin/sh

把 bin/sh 改为 /usr/bin/git-shell (或者用 which git-shell 查看它的实际安装路径)。该行修改后的样子如下:

git:x:1000:1000::/home/git:/usr/bin/git-shell

公共访问

服务器端操作:

首先,开启挂钩:

#cd project.git

#mv hooks/post-update.sample hooks/post-update

#chmod a+x hooks/post-update

post-update 挂钩是做什么的呢?其内容大致如下:

# cat .git/hooks/post-update

#!/bin/sh

#

# An example hook script to prepare a packed repository for use over

# dumb transports.

#

# To enable this hook, rename this file to "post-update".

#

exec git-update-server-info

意思是当通过SSH向服务器推送时,Git将运行这个 git-update-server-info命令来更新匿名HTTP访问获取数据时所需要的文件。

接下来,在Apache配置文件中添加一个VirtualHost条目,把文档根目录设为Git项目所在的根目录。

这里我们假定DNS服务已经配置好,会把对.gitserver的请求发送到这台主机:

<VirtualHost *:80>

    ServerName git.vfast.com.cn

    DocumentRoot /opt/git

    <Directory /opt/git/>

        Order allow,deny

        Allow from all

    </Directory>

</VirtualHost>

另外,需要把/opt/git目录的Unix用户组设定为apache,这样web服务才可以读取仓库内容,

因为运行CGI脚本的Apache实例进程默认就是以该用户的身份起来的:

# chgrp -R apache /opt/git

重启 Apache 之后,就可以通过项目的 URL 来克隆该目录下的仓库了。

#git clone http://git.vfast.com.cn/project.git

gitweb:

#yum install gitweb

安装完成后,CGI 脚本放在/var/www/git/gitweb.cgi。使用配置文件为 /etc/gitweb.conf。

#vim /etc/gitweb.conf

$projectroot = "/data1/code";  #/data1/code 是git仓库的存放目录

#vim /etc/httpd/conf/httpd.conf  增加下面部分(这部分可以不要的看/etc/httpd/conf.d/git.conf就可以了)

<VirtualHost *:80>

    ServerName gitserver

    DocumentRoot /var/www/git

    <Directory /var/www/git>

        Options ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch

        AllowOverride All

        order allow,deny

        Allow from all

        AddHandler cgi-script cgi

        DirectoryIndex gitweb.cgi

    </Directory>

</VirtualHost>

Gitosis:

生成一个git用户的私钥/公钥对:

client1(192.168.10.66):

#ssh-keygen

#scp /root/.ssh/id_rsa.pub 219.234.90.243:/data2/

服务端(219.234.90.243):

#yum install python-setuptools

#git clone https://github.com/tv42/gitosis.git

#git clone git://github.com/res0nat0r/gitosis.git###

#cd gitosis

#python setup.py install

这会安装几个供 Gitosis使用的工具。默认Gitosis会把 /home/git作为存储所有Git仓库的根目录,这没什么不好,

不过我们之前已经把项目仓库都放在 /data1/code里面了,所以为方便起见,我们可以做一个符号连接,直接划转过去,而不必重新配置:

#gitosis-init < /tmp/id_dsa.pub  默认会在用户的家目录下创建仓库repositories目录,如果要想用其他目录的话可以再初始化之前做软连接

         #ln -s /data1/code /root/repositories

#cd /root/repositories/gitosis-admin.git

#chmod 755 /root/repositories/gitosis-admin.git/hooks/post-update

client1(192.168.10.66):

[root@localhost git]# ssh 219.234.90.243

PTY allocation request failed on channel 0

ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.

                                                                  Connection to 219.234.90.243 closed.

说明 Gitosis 认出了该用户的身份,但由于没有运行任何 Git 命令,所以它切断了连接。

#git clone 219.234.90.243:gitosis-admin.git 

[root@localhost gitosis-admin]# ls -r ./*

./gitosis.conf  文件是用来设置用户、仓库和权限的控制文件

./keydir:

root@localhost.localdomain.pub    目录则是保存所有具有访问权限用户公钥的地方— 每人一个。在keydir里的文件名

                                                                           (比如上面的 scott.pub)应该跟你的不一样 — Gitosis 会自动从使用 gitosis-init

                                                                            脚本导入的公钥尾部的描述中获取该名字。 

创建新项目:

#vim gitosis.conf

[gitosis]

[group gitosis-admin]

writable = gitosis-admin

members = root@localhost.localdomain

[group web]

writable = weblog_project

members = root@localhost.localdomain       

#git add .

#git commit -am 'add weblog_project'

#git push origin master (这是server端就能看到gitosis.conf文件的变化了)

生成weblog_project.git 裸仓库

#git remote add weblog 219.234.90.243:weblog_project.git                                                      

#git push weblog master

在新工程weblog_project 里首次推送数据到服务器前,得先设定该服务器地址为远程仓库。

但你不用事先到服务器上手工创建该项目的裸仓库— Gitosis 会在第一次遇到推送时自动创建:

获取weblog_project.git仓库:

#git clone 219.234.90.243:weblog_project.git

client2(192.168.10.67):

#ssh-keygen

#scp /root/.ssh/id_rsa.pub 192.168.10.66:/root/git/gitosis-admin/keydir/sunrencai.pub

client1(192.168.10.66):

#vim gitosis.conf

[gitosis]

[group gitosis-admin]

writable = gitosis-admin

members = root@localhost.localdomain

[group web]

writable = weblog_project

members = root@localhost.localdomain sunrencai

#git add .

#git commit -am 'add a new user'

#git push origin master

client2(192.168.10.67):

#git clone 219.234.90.243:weblog_project.git

#vim gitosis.conf(文件说明)

[gitosis]

[group gitosis-admin]

writable = gitosis-admin

members = root@localhost.localdomain

[group web]

writable = weblog_project

members = root@localhost.localdomain sunrencai

[group web_ro] 设置只读权限

readonly = weblog_project

members = scott josie jessica

[group web_2]

writable  = another_weblog_project

members   = @web john

Gitolite:(使用) 

服务端(219.234.90.243):

#git clone git://github.com/sitaramc/gitolite

#mkdir -p /root/bin/

#gitolite/install -ln   # assumes $HOME/bin exists and is in your $PATH

#gitolite setup -pk /data2/code/192.168.10.66.pub

client1(192.168.10.66):

#git clone 219.234.90.243:gitolite-admin.git

client2(192.168.10.67):

#ssh-keygen

#scp /root/.ssh/id_rsa.pub 192.168.10.66:/root/git/gitolite-admin/keydir/192.168.10.67.pub

client1(192.168.10.66):(增加192.168.10.67这台机器的访问)

[root@localhost gitolite-admin]#vim conf/gitolite.conf 添加192.168.10.67这个用户

repo gitolite-admin

    RW+     =   192.168.10.66 192.168.10.67

repo testing

    RW+     =   @all

#git add .

#git commit -am 'add a new user'

#git push origin master

client2(192.168.10.67):

#git clone 219.234.90.243:gitolite-admin.git

#git clone 219.234.90.243:testing.git

增加一个新项目:

client1(192.168.10.66):(增加一个weblog项目)

[root@localhost gitolite-admin]#vim conf/gitolite.conf 添加192.168.10.67这个用户

[root@localhost gitolite-admin]# more conf/gitolite.conf

repo gitolite-admin

    RW+     =   192.168.10.66 192.168.10.67

repo testing

    RW+     =   @all

repo project_weblog

    RW+     =       192.168.10.66 (只赋予了192.168.10.66这台机器访问,192.168.10.67是访问不了的)

#git add .

#git commit -am 'add a new user'

#git push origin master

#git clone 219.234.90.243:project_weblog.git 因为10.66有读写权限所有可以获取仓库

client2(192.168.10.67):

[root@localhost code]# git clone 219.234.90.243:project_weblog.git

Initialized empty Git repository in /data2/code/project_weblog/.git/

FATAL: R any project_weblog 192.168.10.67 DENIED by fallthru

(or you mis-spelled the reponame)

fatal: The remote end hung up unexpectedly

client1(192.168.10.66):(增加192.168.10.67对weblog项目的只读权限)

[root@localhost gitolite-admin]# more conf/gitolite.conf

repo gitolite-admin

    RW+     =   192.168.10.66 192.168.10.67

repo testing

    RW+     =   @all

repo project_weblog

    RW+     =       192.168.10.66 (只赋予了192.168.10.66这台机器访问,192.168.10.67是访问不了的)

         R           =   192.168.10.67

client2(192.168.10.67):

[root@localhost code]# git clone 219.234.90.243:project_weblog.git

Initialized empty Git repository in /data2/code/project_weblog/.git/

remote: Counting objects: 4, done.

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

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

Receiving objects: 100% (4/4), done.

#git add .

#git commit -am 'add a new user'

#git push origin master (没有写权限)

FATAL: W any project_weblog 192.168.10.67 DENIED by fallthru

(or you mis-spelled the reponame)

fatal: The remote end hung up unexpectedly

gitolite 高级部分:

你可以给用户或者仓库分组。分组名就像一些宏;定义的时候,无所谓他们是工程还是用户;区别在于你使用“宏”的时候

@oss_repos      = linux perl rakudo git gitolite

@secret_repos   = fenestra pear

@admins         = scott

@interns        = ashok

@engineers      = sitaram dilbert wally alice

@staff          = @admins @engineers @interns

 

 

原文地址:https://www.cnblogs.com/wjoyxt/p/5102500.html