首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用"git --bare init“存储库?

如何使用"git --bare init“存储库?
EN

Stack Overflow用户
提问于 2011-10-03 16:05:29
回答 10查看 324.6K关注 0票数 352

我需要创建一个中央Git存储库,但我有点困惑……

我已经创建了一个裸存储库(在我的git服务器机器2中):

代码语言:javascript
复制
$ mkdir test_repo
$ git --bare init

现在,我需要将文件从本地存储库(计算机1)推送到裸存储库(计算机2)。我可以通过SSH访问机器2。问题是,我想我不理解裸库的概念……

在裸存储库中存储代码的正确方式是什么?如何将更改从本地存储库推送到裸存储库?

拥有一个中央存储库的正确方式是拥有一个空存储库吗?

我对这个主题有点困惑。请在这方面给我一点提示。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-10-03 16:10:04

首先,为了检查,您需要在运行git init --bare之前切换到您创建的目录。此外,通常会给裸存储库提供扩展.git。所以你可以这样做

代码语言:javascript
复制
git init --bare test_repo.git

对于小于1.8的Git版本,您可以这样做

代码语言:javascript
复制
mkdir test_repo.git
cd test_repo.git
git --bare init

为了回答你后面的问题,裸存储库(根据定义)没有附加工作树,所以你不能像在普通的非裸存储库中那样轻松地向它们添加文件(例如,使用git add <file>和后续的git commit)。

您几乎总是通过从另一个存储库推送(使用git push)来更新一个裸存储库。

请注意,在这种情况下,您需要首先允许用户推送到您的存储库。当在test_repo.git中时,执行以下操作

代码语言:javascript
复制
git config receive.denyCurrentBranch ignore

社区编辑

代码语言:javascript
复制
git init --bare --shared=group

正如prasanthv评论的那样,如果你在工作中这样做,而不是在私人家庭项目中,这是你想要的。

票数 423
EN

Stack Overflow用户

发布于 2015-07-23 22:54:43

我之所以添加这个答案,是因为在到达这里(带着相同的问题)后,没有一个答案真正描述了从一无所有到完全可用的远程(裸) repo所需的所有步骤。

注意:本例使用本地路径作为裸存储库的位置,但其他git协议(如OP指示的SSH )应该可以正常工作。

我试着为那些不太熟悉git的人添加一些注释。

1.初始化裸存储库...

代码语言:javascript
复制
> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

这将创建一个文件夹(repo.git),并用代表git存储库的git文件填充该文件夹。按照现在的情况,这个repo是无用的--它没有提交,更重要的是,没有分支。虽然您可以克隆此存储库,但不能从中提取。

接下来,我们需要创建一个工作文件夹。有几种方法可以做到这一点,这取决于您是否有现有的文件。

2a。通过克隆空的存储库来创建新的工作文件夹(没有现有文件

代码语言:javascript
复制
git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

仅当/path/to/work不存在或为空文件夹时,此命令才有效。注意这个警告--在这个阶段,你仍然没有任何有用的东西。如果你使用cd /path/to/work并运行git status,你会得到类似这样的结果:

代码语言:javascript
复制
On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

但这是个谎言。您并不是真的在分支提交上(因为git branch不返回任何内容),而且到目前为止,还没有提交。

接下来,在工作文件夹中复制/移动/创建一些文件,将它们添加到git并创建第一个提交。

代码语言:javascript
复制
> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

只有当你还没有告诉git你是谁的时候,才需要git config命令。请注意,如果您现在运行git branch,您现在将看到列出了master分支。现在运行git status

代码语言:javascript
复制
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

这也是误导性的-上游并没有“消失”,只是它还没有被创建,git branch --unset-upstream也不会提供帮助。但这没问题,现在我们有了第一个提交,我们可以推送,并且master将在空的repo上创建。

代码语言:javascript
复制
> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master

在这一点上,我们有一个全功能的裸存储库,它可以克隆到主分支上的其他地方,以及一个可以拉入和推送的本地工作副本。

代码语言:javascript
复制
> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2b。从现有文件创建一个工作文件夹如果你已经有一个包含文件的文件夹(所以你不能克隆到其中),你可以初始化一个新的git repo,添加第一次提交,然后将其链接到空的repo。

代码语言:javascript
复制
> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

在这一点上,我们有了第一个提交和一个本地主分支,我们需要将其转换为远程跟踪的上游分支。

代码语言:javascript
复制
> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

请注意git push上的-u标志,以设置(新的)跟踪的上游分支。就像以前一样,我们现在有了一个全功能的裸存储库,它可以克隆到主分支上的其他地方,以及一个可以拉入和推送的本地工作副本。

所有这一切对一些人来说似乎是显而易见的,但git在最好的时候也会让我感到困惑(它的错误和状态消息确实需要重新处理)-希望这会对其他人有所帮助。

票数 278
EN

Stack Overflow用户

发布于 2011-10-03 16:09:33

逐一回答你的问题:

裸存储库是没有工作树的存储库。这意味着它的全部内容就是您在.git目录中所拥有的内容。

您只能通过从本地克隆push到裸存储库来对其执行commit操作。它没有工作树,所以它没有修改文件,也没有更改。

拥有中央存储库的唯一方法就是拥有一个bare存储库。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7632454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档