• 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
    
  • 相关阅读:
    数据库的三大范式以及五大约束
    解析PHP面向对象的三大特征
    php中的数组遍历的几种方式
    PHP中的函数声明与使用
    使用mui框架打开页面的几种不同方式
    JS中精选this关键字的指向规律你记住了吗
    同一功能三种不同实现方式你选哪个
    转!!NPM报错 Error: EPERM: operation not permitted, unlink......解决办法和清除缓存。
    转!!关于http请求 浏览器 中文编码
    CentOS6.5下Apache防止目录遍历
  • 原文地址:https://www.cnblogs.com/irockcode/p/8761954.html
Copyright © 2020-2023  润新知