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 关联一个远程库
git push –u(第一次要用-u 以后不需要) origin master 把当前master分支推送到远程库
git clone 从远程库中克隆
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