什么是裸存储库,为什么我需要它?

时间:2016-06-23 13:00:01

标签: git github git-bare

这可能已经回答了,但我没有找到一个好的答案 我来自集中式存储库,例如SVN,通常您只执行检出,更新,提交,还原,合并等等。

Git让我发疯了。有很多命令,但最难理解的是为什么很多东西都像他们一样工作。

根据"What is a bare git repository?"

  

使用git init --bare创建的存储库称为裸存储库。它们的结构与工作目录略有不同。首先,它们不包含源文件的工作或签出副本。
      ...
      使用git init --bare创建的裸存储库用于... 共享。 ...开发人员将克隆共享裸仓库,在其仓库的工作副本中进行本地更改,然后推回共享裸仓库以使其他用户可以使用其更改。
       - Jon Saints,http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/

但是,从接受"what's the difference between github repository and git bare repository?"的答案:

  

GitHub上的Git repos是裸的,就像你要推送到 [sic] 的任何远程仓库一样。
       - VonC,https://stackoverflow.com/a/20855207

但是,在GitHub中有源文件。我可以看到他们。如果我创建一个裸存储库,则没有源文件,只有工作存储库的.git目录的内容。

这怎么可能?我不明白的是什么?

您能举例说明为什么我需要一个裸存储库及其以这种方式工作的动机吗?

更新

爱德华汤姆森的回答部分是我想知道的。不过,我会重新提出我的问题:

我发布的第一个链接状态("What is a bare git repository?"):

  

他们[裸存储库]不包含源文件的工作或签出副本。

VonC的回答:

  

GitHub上的Git repos是裸的

两个陈述暗示

  
    

Github没有工作副本。

  
爱德华汤姆森说:

  

它会在您浏览数据时根据数据呈现网页 - 将数据直接从存储库中提取出来并输出到您的网络浏览器,而不是先将数据写入文件服务器上的磁盘

不知何故,裸存储库必须包含所有数据和源代码。如果没有,那么渲染任何东西都是不可能的,因为我可以看到所有源代码更新(提交),所有分支(包括它们各自的源),回购的整个日志等等。

存储库的整个数据是否始终位于.git目录(或裸存储库)中,某种格式能够随时呈现所有文件?这是裸存储库的原因,而工作副本只在给定时间有文件吗?

2 个答案:

答案 0 :(得分:5)

  

存储库的整个数据是否始终位于.git目录(或裸存储库)中,某种格式能够随时呈现所有文件?

是的,这些文件及其完整历史记录存储在.git/packed-refs.git/refs以及.git/objects中。

当你克隆一个仓库(裸露或不裸露)时,始终通过命名约定拥有.git文件夹(或具有.git扩展名的文件夹用于裸仓库)使用其Git管理和控制文件。 (see glossary

Git可以unpack at any time what it needs with git unpack-objects

诀窍是:

从裸仓库中,您可以查询日志(git repo中的git log工作正常:不需要工作树)或list files in a bare repo
show the content of a file from a bare repo
这就是GitHub如何使用文件呈现页面而无需签出完整回购。

我不知道GitHub确实完全,因为大量的repos强制GitHub engineering team进行各种优化。
例如,请参阅how they optimized cloning/fetching a repo 使用 DGit ,这些裸回购实际上会在多个服务器上进行复制。

  

这是裸存储库的原因,而工作副本只在给定时间有文件吗?

对于GitHub,维护一个工作树会在磁盘空间和更新中花费太多(当每个用户请求一个不同的分支时)。最好从独特的裸仓库中提取您需要渲染页面的内容。

一般情况下(在GitHub约束之外),使用裸仓库进行推送,以避免出现working tree out of sync with what has just been pushed。有关具体示例,请参阅“but why do I need a bare repo?”。

话虽如此:

但对于GitHub来说这是不可能的,GitHub不能为每个必须存储的repo维护一个(或服务器)工作树。

答案 1 :(得分:3)

为什么我需要一个?

but why do I need a bare repo?中的链接“ VonC answer”可以用我最近发现的两个用例来完成。

第一个对了解恕我直言至关重要,而第二个可能会受到批评。

A-同步您的原始点文件

没有更多指向您的git repo的符号链接。只需使用:

git init --bare $HOME/.myconf
alias config='/usr/bin/git --git-dir=$HOME/.myconf/ --work-tree=$HOME'
config config status.showUntrackedFiles no

我的~/.myconf目录是一个git裸存储库。然后,可以使用普通命令对主文件夹中的任何文件进行版本控制,例如:

    config status
    config add .vimrc
    config commit -m "Add vimrc"
    config add .config/redshift.conf
    config commit -m "Add redshift config"
    config push

主要优点之一是它可以防止嵌套git repos。有关source

的更多详细信息

B-将Git项目托管在云同步文件夹中

在云同步的文件夹中创建.git/目录不是一个好主意,因为同步可能会使所有事情搞砸。但是,使用与上述相同的技术,您可以在同步目录之外使用裸存储库 来使用版本控制,并且仍然可以舒适地使用同步目录。