Kit*_* Ho 157 git version-control
git init和之间有什么不同git init --bare?我发现--bare他们的Git服务器需要很多博客文章?
从手册页中,它说:
Run Code Online (Sandbox Code Playgroud)--bare创建一个裸存储库.如果未设置GIT_DIR环境,则将其设置为当前工作目录
但它究竟意味着什么?是否需要--bare为Git服务器设置?
Ada*_*ruk 136
此变体创建一个包含工作目录的存储库,以便您可以实际工作(git clone).创建它之后,您将看到该目录包含一个.git文件夹,其中包含历史记录和所有git管道.您在.git文件夹所在的级别工作.
另一个变体创建一个没有工作目录(git clone --bare)的存储库.您没有获得可以工作的目录.现在,目录中的所有内容都是上述案例中.git文件夹中包含的内容.
对没有工作目录的git repos的需求是你可以将分支推送到它并且它不管理某人正在处理什么.您仍然可以推送到一个非裸露的存储库,但是您将被拒绝,因为您可能会移动某人正在该工作目录中工作的分支.
所以在没有工作文件夹的项目中,你只能看到git存储它们的对象.它们被压缩和序列化并存储在其内容的SHA1(哈希)下.为了在裸存储库中获取对象,您需要git show然后指定要查看的对象的sha1.你不会看到像项目一样的结构.
裸存储库通常是中央存储库,每个人都将工作转移到其中.没有必要操纵实际的工作.这是一种在多人之间同步工作的方法.您将无法直接查看项目文件.
如果您是唯一一个从事该项目或者您不需要/需要"逻辑中心"存储库的人,则可能不需要任何裸存储库.一个宁愿git pull 从在这种情况下,其他存储库.这避免了git在推送到非裸存储库时的异议.
希望这可以帮助
dun*_*can 106
裸存储库是没有工作副本的git存储库,因此.git的内容是该目录的顶级存储库.
使用非裸存储库在本地工作,使用裸存储库作为中央服务器/集线器与其他人共享您的更改.例如,在github.com上创建存储库时,它将创建为裸存储库.
所以,在你的电脑中:
git init
touch README
git add README
git commit -m "initial commit"
Run Code Online (Sandbox Code Playgroud)
在服务器上:
cd /srv/git/project
git init --bare
Run Code Online (Sandbox Code Playgroud)
然后在客户端上,你推:
git push username@server:/srv/git/project master
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过将其添加为远程来保存自己的输入.
服务器端的存储库将通过pull和push获取提交,而不是由您编辑文件然后在服务器计算机中提交它们,因此它是一个裸存储库.
您可以推送到不是裸存储库的存储库,git会发现那里有一个.git存储库,但由于大多数"hub"存储库不需要工作副本,因此使用裸存储库是正常的.它并建议,因为在这种存储库中有一个工作副本是没有意义的.
但是,如果您推送到非裸存储库,则会使工作副本不一致,并且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'.
Run Code Online (Sandbox Code Playgroud)
您可以跳过此警告.但推荐的设置是:使用非裸存储库在本地工作,使用裸存储库作为集线器或中央服务器来推送.
如果您想直接与其他开发人员的工作副本共享工作,您可以从彼此的存储库中取出而不是推送.
Sal*_*ali 59
当我不久前读到这个问题时,一切都让我感到困惑.我刚刚开始使用git,并且有这些工作副本(当时没有任何意义).我将尝试从这个人的角度来解释这一点,他刚开始使用git而不知道术语.
可以通过以下方式描述差异的一个很好的例子:
--bare给你一个存储空间(你不能在那里开发).没有--bare它,你就有能力在那里发展(并有一个存储空间).
git init从当前目录创建一个git存储库.它在其中添加.git文件夹,使您可以开始修订历史记录.
git init --bare还会创建一个存储库,但它没有工作目录.这意味着您无法编辑文件,提交更改,在该存储库中添加新文件.
何时--bare可以提供帮助?你和其他几个人正在研究这个项目并使用git.您在某个服务器(amazon ec2)上托管了该项目.你们每个人都拥有自己的机器,然后推动你的代码ec2.你们当中没有人开发任何东西ec2(你使用你的机器) - 你只需要推动你的代码.因此,您ec2只需要存储所有代码,并且应该创建--bare所有机器,而不是--bare(很可能只有一个,其他只会克隆所有内容).工作流程如下所示:

And*_*rew 11
非裸存储库是默认存储库.它是您运行时创建的git init,或者是bare从服务器克隆(没有选项)时获得的内容.
使用此类存储库时,可以查看和编辑存储库中的所有文件.当您与存储库交互时 - 例如通过提交更改 - Git将您的更改存储在一个名为的隐藏目录中.git.
当你有一个git服务器时,不需要有文件的工作副本.您只需要存储的Git数据.git.裸存储库就是.git目录,没有用于修改和提交文件的工作区.
从服务器克隆时,Git在.git目录中具有创建工作副本所需的所有信息.