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

git init 与 git init --bare 区别的更多相关文章

  1. git init和git init -bare区别

    1 Git init  和 git init –bare 的区别 用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作.但别的用户在将更新push上来的 ...

  2. git init 与 git init --bare 的区别

    git init  和 git init –bare 的区别 使用命令"git init --bare"(bare汉语意思是:裸,裸的)初始化的版本库(暂且称为bare repos ...

  3. git init和git init –bare的区别:

    感谢原文作者:ljchlx 原文链接:https://blog.csdn.net/ljchlx/article/details/21805231 git init 和 git init –bare 的 ...

  4. npm遇到的问题--npm install 执行报错 /bin/git submodule update -q --init --recursive

    1.执行npm i 安装依赖时,报错:cannot read property 'match' of undefined 据说是npm本地缓存导致 解决方案: rm -rf package-lock. ...

  5. 【原理、命令】Git基本原理、与Svn的区别、命令

    一.Git是什么? Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程:Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote ...

  6. git database 数据库 平面文件 Git 同其他系统的重要区别 Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异 Git 的设计哲学

    小结: 1.如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来 2.注意 git clone  应指定版本,它复制的这个版本的全部历史信息: 各个分支  git init 数据库 ...

  7. git clone、git pull和git fetch的用法及区别

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流.Git 常用命令速查表 最近在一个学习小组里学习AI的课程,我们所有的学习资料和homework都放在gitlab上.今天一个小队友从gitlab ...

  8. Git简介以及与SVN的区别

    Git是由著名Linux内核(Kernel)开发者LinusTorvalds为了便利维护Linux而开发的. Git是一个分布式的版本控制系统.作为一个分布式的版本控制系统,在Git中并不存在主库这样 ...

  9. git fetch和git pull之间的区别--转载

    原文地址:http://blog.csdn.net/a19881029/article/details/42245955 git fetch和git pull都可以用来更新本地库,它们之间有什么区别呢 ...

随机推荐

  1. DataColumn

    DataColumn 是用于创建 DataTable 的列.下面示例使用不同技巧创建.配置一个列,并把它添加到一个 DataTable 中. using System; using System.Da ...

  2. C#获取外网IP地址;C#获取所在IP城市地址

    public static string GetIP()         {             using (var webClient = new WebClient())           ...

  3. haproxy综合

    常见问题:haproxy启动报错Starting proxy : cannot bind socket?答:查看haproxy.conf配置文件发现其监听80跟apache冲突,而apache没在使用 ...

  4. 浅谈PHP数据结构之栈

    今天開始进阶自己的PHP,首先一切的编程语言都须要修炼自己的"内功",何为程序猿的"内功",我想大概就是数据结构和算法了吧 .毕竟是灵魂,是普通程序猿到高级程序 ...

  5. [CALayer release]: message sent to deallocated instance iOS内存过度释放问题

    [CALayer release]: message sent to deallocated instance iOS内存过度释放问题 解决方式: 1:先找到过度释放的 内存指针 开启-僵尸模式:xc ...

  6. 从零开始编写自己的C#框架(25)——网站部署 【转】

    服务器安全部署文档 目录1.     前言.. 3 2.     部署环境.. 3 2.1         服务器环境信息.. 3 3.     磁盘阵列配置.. 4 4.     安装操作系统.. ...

  7. 流编辑器sed

    sed与grep一样,都起源于老式的ed编辑器,因其是一个流编辑器(stream editor)而得名.与vi等编辑器不同,sed是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑 ...

  8. Flutter混合栈的管理

    Flutter出现的目的旨在统一Android/IOS两端编程,因此完全基于Flutter开发的App,只需提供一个包含FlutterView的页面,后续页面增加/删除/跳转均在FlutterView ...

  9. 【转】Linux下的多线程编程背景知识

    1. 进程和线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(pr ...

  10. 算法笔记_135:格子取数问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 有n*n个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右走,一共走两次(即从左上角往右下角走两趟),把所有经过的格子里的数加起 ...