“ git init”和“ git init —— bay”有什么区别?

git initgit init --bare有什么不同?我发现很多博客文章需要 --bare作为他们的 Git 服务器?

手册页表示:

--bare

创建一个空白的存储库,如果没有设置 GIT _ DIR 环境,则将其设置为当前的工作目录

但是它实际上意味着什么呢? 是否需要为 Git 服务器设置 --bare

91596 次浏览

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

长话短说

裸存储库是一个没有工作副本的 git 存储库,因此。Git 是该目录的顶层。

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

所以,在你的电脑里:

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

然后,您可以通过将其添加为远程控制来保存输入。

服务器端的存储库将通过 pull 和 push 获得提交,而不是通过编辑文件然后在服务器机器上提交,因此它是一个空的存储库。

细节

您可以推送到一个不是裸存储库的存储库,git 将发现存在一个。但是由于大多数“中心”存储库不需要工作副本,因此使用一个裸存储库是正常的,并且推荐使用这种存储库,因为在这种存储库中没有任何工作副本。

但是,如果您推送到一个非空的存储库,您将使工作副本不一致,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 clone)。创建目录后,您将看到该目录包含一个 .git文件夹,历史记录和所有 git 管道都位于该文件夹中。您在 .git文件夹所在的级别工作。

赤裸裸的基特回购

另一个版本创建一个没有工作目录的存储库(git clone --bare)。你没有可以工作的目录。目录中的所有内容现在都包含在上述情况下的 .git文件夹中。

为什么你要使用一个而不是另一个

没有工作目录的 git 回购需要的是这样一个事实: 你可以把分支推向它,但它不能管理别人正在做的事情。你仍然可以推送到一个不是空的存储库,但是你可能会被拒绝,因为你可能会移动某人正在那个工作目录中工作的分支。

因此,在没有工作文件夹的项目中,您只能在 git 存储对象时看到它们。它们被压缩、序列化并存储在其内容的 SHA1(散列)下。为了在一个空的存储库中获得一个对象,您需要 git show,然后指定您想要看到的对象的 sha1。您不会看到类似项目的结构。

裸仓库通常是每个人工作的中心仓库。没有必要操纵实际的工作。这是一种在多个人之间同步努力的方法。您将无法直接查看项目文件。

如果您是项目的唯一工作人员,或者您不想/不需要“逻辑中心”存储库,那么您可能不需要任何裸存储库。在这种情况下,人们更喜欢使用 git pull 来自和其他存储库。这避免了 git 在推送到非裸库时遇到的问题。

希望这个能帮上忙

默认情况下是一个非空的存储库。它是在运行 git init时创建的,或者是在从服务器克隆(没有 bare选项)时创建的。

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

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

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

当我前段时间读到这个问题时,一切都让我感到困惑。我刚开始使用 git,这里有一些工作副本(在当时没有任何意义)。我将试图从这个人的角度来解释这个问题,他刚刚开始 Git,对术语一无所知。

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

--bare只提供了一个存储空间(您不能在那里开发)。如果没有 --bare,您就可以在那里进行开发(并拥有一个存储空间)。

git init从你的工作目录中创建一个 git 存储库。它增加了。Git 文件夹中,并使您可以开始修订历史记录。

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

什么时候 --bare会有帮助?你和其他一些人正在做这个项目并且使用 git。您在某个服务器(amazon ec2)上承载了该项目。你们每个人都有自己的机器,在 ec2上推送代码。实际上你们没有人在 ec2上开发任何东西(你们使用你们的机器)——你们只是推送你们的代码。所以你的 ec2只是一个存储所有代码的存储器,应该创建为 --bare和所有没有 --bare的机器(很可能只有一个,其他机器会克隆所有代码)。工作流程如下:

enter image description here

裸存储库和工作树存储库之间的另一个区别是,在第一种情况下存储 不存储丢失的提交,但只存储属于分支轨道的提交。另一方面,WorkingTree 永远保持所有提交。看下面..。

我用 git init --bare创建了第一个存储库(名称: 赤裸裸的)。是服务器。它在左边,那里没有远程分支,因为这是远程存储库本身。

从第一个库开始,我使用 git clone创建了第二个库(名称: 基特工作树)。在右边。它有连接到远程分支的本地分支。

(文本‘ first’,‘ second’,‘ three’,‘ four’,‘ alpha’,‘ beta’和‘ delta’是提交注释。“主人”和“希腊人”是分支名称。)

Local and remote repositories

现在,我将删除 赤裸裸的(命令: git push --delete origin greek)和 基特工作树(命令: git branch -D greek)中本地的名为‘ greek’的分支。这棵树看起来是这样的:

The git-bare repository deletes what is no longer referenced

赤裸裸的存储库同时删除分支和所有引用的提交。在图中我们可以看到,它的树由于这个原因而减少了。

另一方面,相当于常用本地存储库的 基特工作树存储库不删除提交,现在只能通过使用 git checkout 7fa897b7命令的散列直接引用提交。这就是为什么它的树没有修改过的结构。

简而言之: 提交从不在 工作树存储库中删除,而是在 光秃秃的存储库中删除。

实际上,只有在本地存储库中存在已删除的分支时,才能恢复服务器上的分支。

但是非常奇怪的是,在删除一个远程分支之后,光秃秃的存储库的大小并没有减少磁盘的大小。也就是说,文件还在那里。通过使用 git gc --prune命令删除不再被引用或永远不能被引用(后一种情况)的内容来转储存储库