Git服务器搭建
1. 环境部署
系统环境:服务器端:CentOS 6.5 ,ip:192.168.56.100 Master
客户端:CentOS 6.5 ,ip:192.168.56.101 Slave
软件版本:服务器端:源码编译安装,git-2.3.2.tar.gz
客户端:yum在线安装机制
2. 安装
2.1 服务器端:
#yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
wget https://www.kernel.org/pub/software/scm/git/git-2.3.2.tar.gz
#tar zxvf git-2.3.2.tar.gz
#cd git-2.3.2
#make prefix=/usr/local all
#make prefix=/usr/local install #root用户运行
查看版本号:git --version
git version 2.3.2
安装gitosis:gitosis为Git用户权限管理系统,通过管理服务端的/home/git/.ssh/authorized_key文件来执行对用户权限的管理,是一个python模块包
#yum install python python-setuptools
#git clone git://github.com/res0nat0r/gitosis.git
#cd gitosis/
#python setup.py install
*******************************************************************************************************************************************
yum install git
建立一个 Git用户
groupadd user
useradd -g user -d /home/data/www/ user #这是这个用户组存放的路径
chown —R user.user /home/data/
3. 创建客户端登录证书
注,收集所有需要登录的用户的公钥,就是他们自己生成的id_rsa.pub文件,把所有公钥复制到/home/data/www/.ssh/authorized_keys文件里,一行一个。嘿嘿!
1).客户端生成id_rsa.pub文件的命令 客户端:CentOS 6.5 ,ip:192.168.56.101
$ ssh-keygen -t rsa
$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NwUHeNNi+PC6KlrcJrXXDmKxRMmgHIPp79sgX6zqfdSlmNj7rBPQeyEKS9Wg8yI6jd8aG2jsUx99Vjti2VK2vEXKkRHxwID7ri69gE71RfDtv6ekafnzLo14J8hAp0spMk+N3wEAQRYDmcYo1wmnm/jMBedGrHj4NJQ1vYy1hVtJasGMSzjcMrlz9qvaluWnQ5tQjKFQVVwKsRRRzs8qTvzVhLJt4NQ+CAN45tqfsRuf58Uba9QNK7/6xSUiIKXQiILz8PMGJ3MnlV+eN3wx2aeztdevxu9plggtG05SMmd8GNVzXrN1IaxXSvz0UwjQ2kygu7aCqO8AZWH49rouw== leo@LEO-PC
2). 将 客户端的 id_rsa.pub 添加到 服务端 Git用户的根目录
服务端 操作 :
cd /home/data/www/
mkdir .ssh
vim .ssh/authorized_keys
将 服务端 id_rsa.pub 里的公钥复制进去
此时可以尝试 在客户端192.168.56.101 连接 服务端 192.168.56.100
ssh [email protected]
reverse mapping checking getaddrinfo for unassigned.psychz.net [192.168.56.100] failed - POSSIBLE BREAK-IN ATTEMPT!
-bash-4.1$
4. 初始化Git仓库
在服务的选择你需要创建 仓库 的目录
su user
cd /home/data/www
git init .
git config receive.denyCurrentBranch ignore
git config --bool receive.denyNonFastForwards false
cd .git/hooks
mv post-update.sample post-update
vim post-update
#!/bin/sh
#
# This hook does two things:
#
# 1. update the "info" files that allow the list of references to be
# queries over dumb transports such as http
#
# 2. if this repository looks like it is a non-bare repository, and
# the checked-out branch is pushed to, then update the working copy.
# This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update".
git update-server-info
is_bare=$(git config --get --bool core.bare)
if [ -z "$is_bare" ]
then
# for compatibility's sake, guess
git_dir_full=$(cd $GIT_DIR; pwd)
case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi
update_wc() {
ref=$1
echo "Push to checked out branch $ref" >&2
if [ ! -f $GIT_DIR/logs/HEAD ]
then
echo "E:push to non-bare repository requires a HEAD reflog" >&2
exit 1
fi
if (cd $GIT_WORK_TREE; git diff-files -q --exit-code >/dev/null)
then
wc_dirty=0
else
echo "W:unstaged changes found in working copy" >&2
wc_dirty=1
desc="working copy"
fi
if git diff-index --cached HEAD@{1} >/dev/null
then
index_dirty=0
else
echo "W:uncommitted, staged changes found" >&2
index_dirty=1
if [ -n "$desc" ]
then
desc="$desc and index"
else
desc="index"
fi
fi
if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
then
new=$(git rev-parse HEAD)
echo "W:stashing dirty $desc - see git-stash(1)" >&2
( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
git update-ref --no-deref HEAD HEAD@{1}
cd $GIT_WORK_TREE
git stash save "dirty $desc before update to $new";
git symbolic-ref HEAD "$ref"
)
fi
# eye candy - show the WC updates 🙂
echo "Updating working copy" >&2
(cd $GIT_WORK_TREE
git diff-index -R --name-status HEAD >&2
git reset --hard HEAD)
}
if [ "$is_bare" = "false" ]
then
active_branch=`git symbolic-ref HEAD`
export GIT_DIR=$(cd $GIT_DIR; pwd)
GIT_WORK_TREE=${GIT_WORK_TREE-..}
for ref
do
if [ "$ref" = "$active_branch" ]
then
update_wc $ref
fi
done
fi
chmod +x post-update
cd ../../
初始化全局设置
git config --global user.name "Administrator"
git config --global user.email "[email protected]"
在将所用内容纳入 Git 管理器之前 总有些是无需纳入Git 的管理 比如说一些特殊文件不想被修改等等
touch .gitignore
vim .gitignore #添加完无需纳入版本库的保存退出
git add . #添加 将整个项目纳入版本库
git commit -m 'The Git Create' # -m 后面书写的是此次添加的 核心 (文本说明)
git checkout -f # 恢复至最初的数据
忽略某些文件
一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生
成的文件,像是日志或者编译过程中创建的等等。我们可以创建一个名为.gitignore 的文件,列出要忽略的
文件模式,来看一个简单的例子:
$ cat .gitignore
*.[oa]
*~
第一行告诉Git 忽略所有以.o 或.a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现
的,我们用不着跟踪它们的版本。第二行告诉Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件
(比如Emacs)都用这样的文件名保存副本。此外,你可能还需要忽略log,tmp 或者pid 目录,以及自动
生成的文档等等。要养成一开始就设置好.gitignore 文件的习惯,以免将来误提交这类无用的文件。
文件.gitignore 的格式规范如下:
? 所有空行或者以注释符号# 开头的行都会被Git 忽略。
? 可以使用标准的glob 模式匹配。
? 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
? 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的glob 模式是指shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配
任何一个列在方括号中的字符(这个例子要么匹配一个a,要么匹配一个b,要么匹配一个c);问号(?)
只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配
(比如[0-9] 表示匹配所有0 到9 的数字)。
我们再看一个.gitignore 文件的例子:
# 此为注释– 将被Git 忽略
*.a # 忽略所有.a 结尾的文件
!lib.a # 但lib.a 除外
/TODO # 仅仅忽略项目根目录下的TODO 文件,不包括subdir/TODO
build/ # 忽略build/ 目录下的所有文件
doc/*.txt # 会忽略doc/notes.txt 但不包括doc/server/arch.txt
5. 禁用shell登录
注,出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
[root@git ~]# cat /etc/passwd | grep user
user:x:503:503::/home/data/www:/bin/bash
改为:
[root@git ~]# vim /etc/passwd
user:x:503:503::/home/data/www:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
6. 克隆远程仓库
在客户端执行如下命令:
cd /home/data/ #进入你需要放克隆远程仓库的目录 注会将根目录一同复制过来 即此处的 www/ 目录
git clone [email protected]:/home/data/www/.git
Initialized empty Git repository in /home/data/www/.git/
reverse mapping checking getaddrinfo for unassigned.psychz.net [192.168.56.100] failed - POSSIBLE BREAK-IN ATTEMPT!
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 10 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (10/10), done.
7. git 客户端的添加、删除 、恢复删除、修改、 重命名 提交到 服务端
假设存在 /home/data/www/htdocs/www.test.com
1) 添加 文件
添加 Hello.html 文件 在客户端 192.168.56.101
[root@seoseo04 www.test.com]# cd /home/data/www/htdocs/www.test.com
[root@seoseo04 www.test.com]# touch Hello.html #创建文件
#提交创建的文件至服务端所需要的操作:
#git 添加所有的 同样也可以只添加hello.html git add Hello.html
#注意 路径问题 由于当前在www.test.com 目录 否则请写绝对路径
[root@seoseo04 www.test.com]# git add .
[root@seoseo04 www.test.com]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: Hello.html
#
#将索引内容添加到仓库中 并写明提交的描述信息
[root@seoseo04 www.test.com]# git commit -m "Git Add Hello.html"
[master 220825d] Git Add Hello.html
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 htdocs/www.test.com/Hello.html
#Git commit 说明:
git commit -m "提交的描述信息"
如果我们这里不用-m参数的话,git将调到一个文本编译器(通常是vim)来让你输入提交的描述信息
可能一天下来,你对工作树中的许多文档都进行了更新(文档添加、修改、删除),但是我忘记了它们的名字,此时若将所做的全部更新添加到索引中,比较轻省的做法就是:
git commit -a -m "提交的描述信息"
git commit 命令的-a 选项可只将所有被修改或者已删除的且已经被git管理的文档提交倒仓库中。如果只是修改或者删除了已被Git 管理的文档,是没必要使用git add 命令的。
git add .命令除了能够判断出当前目录(包括其子目录)所有被修改或者已删除的文档,还能判断用户所添加的新文档,并将其信息追加到索引中。
#提交至服务端 192.168.56.100
[root@seoseo04 www.test.com]# git push
Counting objects: 8, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 413 bytes, done.
Total 5 (delta 0), reused 0 (delta 0)
remote: Push to checked out branch refs/heads/master
remote: Updating working copy
remote: A htdocs/www.test.com/Hello.html
remote: HEAD is now at 220825d Git Add Hello.html
To [email protected]:/home/data/www/.git
3393387..220825d master -> master
#此时查看服务端 192.168.56.100 目录 你将可以看到先添加的 Hello.html
[root@domain www.test.com]# ls
Hello.html index.html
2) 修改文件
[root@seoseo04 www.test.com]# vim index.html #随便写点内容测试
[root@seoseo04 www.test.com]# git status #查看下当前状态 会看到README 文件已被跟踪,并处于暂存状态:
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
no changes added to commit (use "git add" and/or "git commit -a")
文件index.html 出现在"Changed but not updated" 这行下面,说明已跟踪文件的内容发生了变
化,但还没有放到暂存区。要暂存这次更新,需要运行git add 命令(这是个多功能命令,根据目标文件的状
态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时
把有冲突的文件标记为已解决状态等)。现在让我们运行git add 将index.html 放到暂存区,然后再看
看git status 的输出:
[root@seoseo04 www.test.com]# git add . #或者 git add index.html
[root@seoseo04 www.test.com]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
现在文件都已暂存,下次提交时就会一并记录到仓库。假设此时,你想要在index.html 里再加条
注释,重新编辑存盘后,准备好提交。不过且慢,再运行git status 看看:
[root@seoseo04 www.test.com]# vim index.html
[root@seoseo04 www.test.com]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
见鬼!index.html 文件出现了两次!一次算未暂存,一次算已暂存,这怎么可能呢?好吧,实际上Git
只不过暂存了你运行git add 命令时的版本,如果现在提交,那么提交的是添加注释前的版本,而非当前工
作目录中的版本。所以,运行了git add 之后又作了修订的文件,需要重新运行git add 把最新版本重新暂存
起来:
[root@seoseo04 www.test.com]# git add .
[root@seoseo04 www.test.com]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
[root@seoseo04 www.test.com]# git commit -m "Editindex.html at 2015-03-23 By zhongzuzhu"
[root@seoseo04 www.test.com]# git push
3) 放弃文件的修改
[root@seoseo04 www.test.com]# vim index.html
[root@seoseo04 www.test.com]# git status #查看下当前状态 会看到README 文件已被跟踪,并处于暂存状态:
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
no changes added to commit (use "git add" and/or "git commit -a")
此时可以看出文件已经被修改 那么如果修改太多导致出错或者一些其他问题又不记得改了那些又或者不想在一点一点的往回改 想要放弃之前的修改怎么做
查看当前修改的和未修改的区别
[root@seoseo04 www.test.com]# git diff
diff --git a/htdocs/www.test.com/index.html b/htdocs/www.test.com/in
index 6443d2f..bdff83a 100644
--- a/htdocs/www.test.com/index.html
+++ b/htdocs/www.test.com/index.html
@@ -1,3 +1,4 @@
This is test
This right?
ok ?
+Hello
这里我只是测试此功能 可以看出来只是添加了一行字符 Hello 现在放弃之前的修改
[root@seoseo04 www.test.com]# git checkout index.html
再度执行 diff 可以发现是空白的没有显示 说明现在的文档和修改前的一致没有变化了 还原了 在查看status 可以看到没有需要提交的
[root@seoseo04 www.test.com]# git diff
[root@seoseo04 www.zhongzuzhu.com]# git status
# On branch master
nothing to commit (working directory clean)
git放弃对当前文件夹的所有文件的修改
[root@seoseo04 www.test.com]# git checkout .
4) 删除 文件
[root@seoseo04 www.test.com]# git rm Hello.html
rm 'htdocs/www.test.com/Hello.html'
[root@seoseo04 www.test.com]# git commit -m "Delete Hello.html"
[master 7bde3a5] Delete Hello.html
0 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 htdocs/www.test.com/Hello.html
[root@seoseo04 www.test.com]# git push
4) 重命名 文件夹
将 www.test.com 重命名为 test.com
[root@seoseo04 htdocs]# git mv www.test.com test.com
[root@seoseo04 htdocs]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: www.test.com/2.txt -> test.com/2.txt
#
[root@seoseo04 htdocs]# git add .
[root@seoseo04 htdocs]# git commit -m "remove file name "
[master 1a4cfd4] remove file name
1 files changed, 0 insertions(+), 0 deletions(-)
rename htdocs/{www.test.com => test.com}/2.txt (100%)
[root@seoseo04 htdocs]# git push
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 387 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Push to checked out branch refs/heads/master
remote: Updating working copy
remote: A htdocs/test.com/2.txt
remote: D htdocs/www.test.com/2.txt
remote: HEAD is now at 1a4cfd4 remove file name
To [email protected]:/home/data/www/.git
178c336..1a4cfd4 master -> master
其实,运行git mv 就相当于运行了下面三条命令:
$ mv www.test.com test.com
$ git rm www.test.com
$ git add test.com
没有评论