“git init”和“git init –bare”有什么区别?

git initgit init --bare什么区别git init --bare ? 我发现很多博客文章需要 – 他们的Git服务器?

从手册页上 ,它说:

 --bare 

创build一个裸仓库。 如果未设置GIT_DIR环境,则将其设置为当前工作目录

但是这实际上意味着什么呢? 是否需要 – Git服务器安装程序?

非裸Git回购

这个变种创build一个工作目录的仓库,所以你可以真正的工作( git clone )。 创build它后,你会看到该目录包含一个.git文件夹,历史和所有的gitpipe道。 您在.git文件夹所在的级别工作。

裸Git回购

另一个变种创build一个没有工作目录的仓库( git clone --bare )。 你没有得到一个你可以工作的目录。 目录中的所有东西现在都包含在上面的例子中。

为什么你会使用一个对另一个

没有工作目录的git仓库的需要是你可以推动分支到它,而不是pipe理什么人正在工作。 您仍然可以推送到一个不是空白的存储库,但是您将被拒绝,因为您可能会移动该工作目录中正在处理的某个分支。

所以在一个没有工作文件夹的项目中,你只能看到git存储它们的对象。 它们被压缩和序列化并存储在其内容的SHA1(哈希)下。 为了得到裸仓库中的对象,你需要git show ,然后指定你想要查看的对象的sha1。 你不会看到像你的项目看起来像一个结构。

裸仓库通常是每个人都将工作转移到其中的中央仓库。 没有必要操纵实际的工作。 这是一种同步多个人的努力的方式。 你将无法直接看到你的项目文件。

如果你是唯一一个在项目上工作的人,或者你不想/需要一个“逻辑上集中”的仓库,你可能不需要任何仓库。 在这种情况下,人们更喜欢其他仓库获取git pull 。 这样可以避免git在推送到非裸存储库时的反对意见。

希望这可以帮助

简短的回答

裸仓库是没有工作副本的git仓库,因此.git的内容是该目录的顶层。

使用非裸存储库在本地工作,将裸存储库作为中央服务器/集线器与其他人共享您的更改。 例如,当你在github.com上创build一个仓库时,它被创build为一个裸仓库。

所以,在你的电脑里:

 git init touch README git add README git commit -m "initial commit" 

在服务器上:

 cd /srv/git/project git init --bare 

然后在客户端,你推:

 git push username@server:/srv/git/project master 

然后,您可以通过将其添加为远程来保存input。

服务器端的存储库将通过pull和push获取提交,而不是通过编辑文件然后将其提交到服务器机器,因此它是一个裸仓库。

细节

您可以推送到不是裸仓库的仓库,git会发现那里有一个.git仓库,但是由于大多数“仓库”仓库不需要工作副本,所以使用裸仓库它并build议在这种types的存储库中有一个工作副本是没有意义的。

但是,如果你推到一个非裸仓库,你正在使工作副本不一致,git会警告你:

 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'. 

你可以跳过这个警告。 但推荐的设置是:使用非裸仓库在本地工作,并将裸仓库作为集线器或中央服务器进行推送。

如果您想直接与其他开发人员的工作副本共享工作,则可以从其他开发人员那里获取,而不是推送。

前段时间我读到这个问题的时候,一切都让我感到困惑。 我刚开始使用git,并有这些工作副本(这意味着当时什么都没有)。 我会试着从这个人的angular度来解释这个问题,他刚刚开始不了解术语。

差异的一个很好的例子可以用下面的方式描述

--bare只给你一个存储空间(你不能在那里开发)。 没有 – 它让你有能力在那里开发(并有一个存储空间)。

git init从当前目录创build一个git仓库。 它在里面添加了.git文件夹,并且可以开始修改历史logging。

git init --bare也创build一个存储库,但是它没有工作目录。 这意味着您不能编辑文件,提交您的更改,在该存储库中添加新文件。

何时 – 可以有帮助? 你和其他几个人正在研究这个项目并使用git。 你在一些服务器上托pipe这个项目( amazon ec2 )。 你们每个人都有你自己的机器,你把你的代码放在ec2 。 你们谁都没有在ec2上开发任何东西(你使用你的机器) – 你只是推你的代码。 所以你的ec2只是一个存储所有的代码,应该创build为--bare和所有你的机器没有--bare (最可能只是一个,其他将只是克隆一切)。 工作stream程如下所示:

在这里输入图像说明

默认的Git仓库假定你将使用它作为你的工作目录。 通常,当你在服务器上时,你不需要有一个工作目录。 只是存储库。 在这种情况下,你应该使用--bare选项。

非裸存储库是默认的。 这是运行git init时创build的内容,或者是从服务器克隆(没有bare选项)时得到的内容。

当您使用这样的存储库时,您可以查看和编辑存储库中的所有文件。 当您与存储库进行交互时(例如通过提交更改),Git会将您的更改存储在名为.git的隐藏目录中。

当你有一个git服务器时,不需要有文件的工作副本。 所有你需要的是存储在.git的Git数据。 裸存储库正是.git目录,没有用于修改和提交文件的工作区。

从服务器克隆时,Git拥有它在.git目录中所需的所有信息来创build工作副本。