git init 与 git init --bare 区别

git init 与 git init --bare 区别

发现问题
最早是在公司的wiki上发现了这个命令,google后发现值得记录下来

实践中发现的区别

网上找了很多资料,但说的很乱,干脆在自己的服务器上执行对比了一下:

git init demo1  # 表示创建一个叫demo1的私人仓库
# git init目录下只有一个.git隐藏文件夹,里面包含各种信息
git init --bare deme2  # 表示创建一个裸库,主要应用场景是作为公共仓库
# 裸库的目录下没有隐藏.git目录,全都是显示的,没有.git这个目录,进入文件直接是文件内容
# 一般来讲,作为远端备份或公共版本库时,应该使用git init --bare。

图片来自阮一峰网站
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库

详细说一下使用 --bare 参数的含义,使用 --bare 参数初始化的仓库,我们一般称之为裸仓库, 因为这样创建的仓库并不包含 工作区 , 也就是说,我们并不能在这个目录下执行我们一般使用的 Git 命令。

原因分析

参考链接

用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作。但别的用户在将更新push上来的时候容易出现冲突。

比如有用户在该目录(就称为远端仓库)下执行git操作,且有两个分支(master 和 b1),当前在master分支下。另一个用户想把自己在本地仓库(就称为本地仓库)的master分支的更新提交到远端仓库的master分支
他就想当然的敲了命令git push origin master:master自然就会发生冲突

因为远端仓库的用户正在master的分支上操作,而你又要把更新提交到这个master分支上,当然就出错了。
但如果是往远端仓库中空闲的分支上提交还是可以的,比如git push origin master:b1 还是可以成功的

解决办法就是使用”git init –bare”方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This operation must be run in a work tree”)

这个就是最好把远端仓库初始化成bare仓库的原因。

这个文章写得很详细

一些实际中用到的操作

在远程段10.10.0.10

添加用户

useradd -s /usr/bin/git-shell chen  # 指定git-shell
usermod -g git chen  # 修改用户组
passwd chen  # 修改密码

添加项目

cd /git  # 进入git的根目录
git init --bare ngx_luacode.git  # 创建git公共仓库(目录)
chown git.git ngx_luacode.git/ -R  # 修改属主属组
chmod 775 ngx_luacode.git/ -R  # 修改权限

git 项目添加

cd ngx_luacode.git  # 进入目录
修改config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = true
        sharedrepository = 1
[receive]
        denyNonFastforwards = true
  • 当涉及两种系统的时候,会出现权限问题,即windows访问,导致linux文件权限修改,git会识别权限,认为文件被修改了,所以建议修改config中的参数filemode = false
  • 当执行了git reset命令,版本回退后没有恢复,造成本地仓库的提交版本号落后于远端仓库的提交版本号。可以执行 git push -f命令去强制提交,为了防止这种操作,在配置文件中设置denyNonFastforwards = true
10.10.0.14(在本地仓库)

拉取

git clone 用户名@git.master.com:/git/xxxx.git
vim .git/config
filemode = false
posted @ 2018-04-09 18:43  陈浩然201  阅读(6170)  评论(0编辑  收藏  举报