资讯专栏INFORMATION COLUMN

Git 本地仓库和裸仓库

amuqiao / 2150人阅读

摘要:用法将当前目录转换为一个本地仓库这个命令执行后会在本地生成一个的文件夹,用来追踪仓库的所有变更。裸仓库一般情况下是作为远端的中心仓库而存在的。

通常我们会用 git init 命令来将我们所在的目录转换为一个 Git 本地仓库或者初始化一个新的空仓库。

用法

将当前目录转换为一个本地仓库

git init

这个命令执行后会在本地生成一个 .git 的文件夹,用来追踪仓库的所有变更。效果如下:

指定某个目录成为本地仓库

git init 

这个命令执行后, 将创建一个名为repo且只包含 .git 子文件夹的空目录。效果如下:

指定某个目录成为中心仓库(裸仓库)

git init --bare  

这个命令执行后,将在本地创建一个名为 repo 的文件夹, 里面包含着 Git 的基本目录, 我们一般会将这个文件夹命名为后面加 .git 的形式,如 repo.git (这也是为什么我们从 GitHub clone 仓库的时候,地址都是 xxx.git 这样的形式的原因)。效果如下:

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

对比

我们来对比一下直接使用 git init 创建的仓库和加了 --bare 参数的两个仓库。 我们直接看两个仓库的的 config 文件中的内容:

直接 git init 创建的仓库:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true

加了 --bare 创建的裸仓库:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = true
    ignorecase = true
    precomposeunicode = true

可以看到最直观的差异在于 bare 配置项是否为 true , 此外不加 --bare 创建的本地仓库配置中有一项 logallrefupdates = true , 作用根据名字就可以看出来, 记录所有的 ref (引用) 更新, 关于 ref 的部分之后有时间可以再写,这个配置可以理解为是 Git 的一道防线。

功能差异

我们可以使用最简单的例子演示一下。

# 直接创建本地仓库
(Tao) ➜  git init repo

# 创建裸仓库
(Tao) ➜  git init --bare repo.git

# 分别 clone 两个仓库
(Tao) ➜  git clone repo c1
Cloning into "c1"...
warning: You appear to have cloned an empty repository.
done.
(Tao) ➜  git clone repo.git c2
Cloning into "c2"...
warning: You appear to have cloned an empty repository.
done.

# 进入 c1 仓库

(Tao) ➜  cd c1
(Tao) ➜  c1 git:(master) touch test
(Tao) ➜  c1 git:(master) ✗ g add -A
(Tao) ➜  c1 git:(master) ✗ g commit -m "test commit"
[master (root-commit) b1e32ad] test commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test
(Tao) ➜  c1 git:(master) git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 200 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require "git reset --hard" to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set "receive.denyCurrentBranch" configuration variable to
remote: error: "ignore" or "warn" in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: "receive.denyCurrentBranch" configuration variable to "refuse".
To /Users/tao/repo
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to "/Users/tao/repo"

# 进入 c2 仓库重复执行

(Tao) ➜  c1 git:(master) cd ../c2
(Tao) ➜  c2 git:(master) touch test
(Tao) ➜  c2 git:(master) ✗ git add -A
(Tao) ➜  c2 git:(master) ✗ git commit -m "test commit"
[master (root-commit) 7aacc58] test commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test
(Tao) ➜  c2 git:(master) git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 201 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/tao/repo.git
 * [new branch]      master -> master

从裸仓库 clone 下来的本地仓库可以进行正常的 push 操作, 但是从一般仓库 clone 下来的本地仓库却不行。 这也正是裸仓库存在的意义。 裸仓库一般情况下是作为远端的中心仓库而存在的。

总结

使用 git init --bare 可以创建一个裸仓库,并且这个仓库是可以被正常 clonepush 更新的, 裸仓库不包含工作区,所以并不会存在在裸仓库上直接提交变更的情况。


可以通过公众号 TheMoeLove 和我联系

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9685.html

相关文章

  • Git workflow 详谈

    摘要:在合并完成后,可以执行将自己开发的功能发布至中心仓库。特性分支工作流基于特性的分支工作流,可以为每个特性做隔离,避免对中心仓库主干代码造成影响。修复分支,用于对线上主分支代码的及时修复,待修复完成后,合并进入主分支,再并入开发分支。 作为一名工程师, Git 在日常开发中是不可或缺的工具。这里详细介绍几种比较常用的基于 Git 的工作流模型, 以便于团队协作的规范化和效率提升。 中心化...

    funnyZhang 评论0 收藏0
  • Git 实用指南

    摘要:个人整理的一些常用的概念和命令集合,方便速查和快速解决某些场景下的问题,覆盖了日常开发和协同工作下的一部分场景,不只是命令行的介绍。常用命令创建一个空白的仓库指的是本地的仓库关联的远程仓库。 个人整理的一些常用的 Git 概念和命令集合,方便速查和快速解决某些场景下的问题,覆盖了日常开发和协同工作下的一部分场景,不只是命令行的介绍。欢迎关注语雀原文,持续更新! 精简入门 1、克隆仓库...

    qpal 评论0 收藏0
  • 如何使用Git上传项目代码到github

    摘要:是一个基于的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开。这就表示已成功连上。大功告成,现在你知道如何将本地的项目提交到上了。文件顾名思义就是告诉需要忽略的文件,这是一个很重要并且很实用的文件。 github是一个基于Git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开。这对于一般人来说公共仓库...

    JayChen 评论0 收藏0
  • 使用GitHub(二):配置并使用Git创建版本库

    摘要:使用二配置并使用创建版本库本文简单介绍使用对代码进行版本控制,包括添加配置使用创建版本库并在上进行管理,主要目的是对学习内容进行总结以及方便日后查阅。使用创建版本库使用有三种方式,请按照需求选择。 使用GitHub(二):配置并使用Git创建版本库 本文简单介绍使用GitHub对代码进行版本控制,包括添加SSHkey、配置Git、使用Git创建版本库并在GitHub上进行管理,主要目...

    wangym 评论0 收藏0
  • 使用GitHub(二):配置并使用Git创建版本库

    摘要:使用二配置并使用创建版本库本文简单介绍使用对代码进行版本控制,包括添加配置使用创建版本库并在上进行管理,主要目的是对学习内容进行总结以及方便日后查阅。使用创建版本库使用有三种方式,请按照需求选择。 使用GitHub(二):配置并使用Git创建版本库 本文简单介绍使用GitHub对代码进行版本控制,包括添加SSHkey、配置Git、使用Git创建版本库并在GitHub上进行管理,主要目...

    XFLY 评论0 收藏0

发表评论

0条评论

amuqiao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<