你如何使用“git –bare init”版本库?

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

我已经创build了一个裸仓库(在我的git服务器,机器2):

$ mkdir test_repo $ git --bare init 

现在我需要将文件从本地存储库(机器1)推送到裸存储库(机器2)。 我可以通过SSH访问机器2。 事情是,我觉得我不明白裸仓库的概念…

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

有一个中央存储库有一个裸仓库的正确方法?

我对这个问题有点困惑。 请给我一个线索。

首先,为了检查,在运行git init --bare之前,你需要改变你创build的目录。 此外,传统上给裸存储扩展名.git 。 所以你可以做

 git init --bare test_repo.git 

对于Git版本<1.8,你会这样做

 mkdir test_repo.git cd test_repo.git git --bare init 

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

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

请注意,在这种情况下,您需要首先允许用户推送到您的存储库。 在test_repo.git里面的test_repo.git

 git config receive.denyCurrentBranch ignore 

===社区编辑===

 git init --bare --shared=group 

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

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

注意:这个例子使用本地path作为裸回购的位置,但其他的git协议(如OP所示的SSH)应该可以正常工作。

对于那些不太熟悉git的人来说,我试着添加一些注释。

1.初始化裸回购…

 > git init --bare /path/to/bare/repo.git Initialised empty Git repository in /path/to/bare/repo.git/ 

这会创build一个文件夹(repo.git),并用代表git仓库的git文件填充它。 就目前来看,这个回购没有用处 – 它没有提交,更重要的是没有分支 。 虽然你可以克隆这个回购,但你不能从中拉出来。

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

2A。 通过克隆空的回购创build一个新的工作文件夹(没有现有的文件)

 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 ,你会得到如下的东西:

 On branch master Initial commit nothing to commit (create/copy files and use "git add" to track) 

但这是一个谎言。 你不是真的在分支master (因为git branch没有返回),到目前为止,没有提交。

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

 > 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

 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 

这也是误导 – 上游没有“走”,它只是还没有创build, git branch --unset-upstream不会帮助。 但是,没关系,现在我们有了第一个提交,我们可以推送并且掌握在裸回购上创build。

 > 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 

在这一点上,我们有一个function齐全的裸回购,可以在主分支上的其他地方克隆,以及可以拉和推的本地工作副本。

 > git pull Already up-to-date. > git push origin master Everything up-to-date 

2B。 从现有文件创build一个工作文件夹如果你已经有一个文件夹(所以你不能克隆),你可以初始化一个新的git仓库,添加第一个提交,然后将其链接到裸回购。

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

在这一点上,我们有我们的第一个提交和一个本地主分支,我们需要变成一个远程跟踪上游分支。

 > 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推-u标志设置(新)跟踪上游分支。 就像以前一样,我们现在有一个function齐全的裸回购,它可以在主分行的其他地方克隆,也可以在本地工作副本上进行推送。

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

一个接一个的回答你的问题:

裸仓库是没有工作树的仓库。 这意味着它的全部内容就是你在.git目录下的内容。

您只能通过从本地克隆push送到裸仓库。 它没有工作树,所以没有文件修改,没有改变。

拥有中央存储库是拥有bare存储库的唯一途径。

你也可以让git为你创build目录:

 git init --bare test_repo.git 

一般的做法是把中央仓库作为裸仓库推入。

如果你有SVN背景,你可以把一个SVN仓库与一个Git裸仓库联系起来。 它没有原始格式的回购文件。 鉴于您的本地回购将有形成您的“代码”的文件另外。

你需要从你的本地仓库添加一个远程仓库,并把你的“代码”放到仓库里。

它会是这样的:

 git remote add central <url> # url will be ssh based for you git push --all central 

这应该够了:

 git remote add origin <url-of-bare-repo> git push --all origin 

查看更多详情“ GIT:如何更新我的裸回购? ”。
笔记:

  • 您可以使用与“ origin ”不同的名称作为裸回购远程引用。
  • 这不会推你的标签,你需要一个单独的git push --tags origin

validation您推送的代码实际上已经提交是很好的。

您可以通过使用–relative选项显式设置path来获取裸存储库上的更改日志。

 $ cd test_repo $ git log --relative=/ 

这将告诉你所做的改变,就好像这是一个常规的git回购。

–bare标志创build一个没有工作目录的仓库。 裸存储库是中央存储库,您不能在此处编辑(存储)代码以避免合并错误。

例如,当您在本地存储库(计算机1)中添加文件并将其推送到裸存储库时,无法在裸存储库中看到该文件始终为“空”。 然而,你真的把某些东西推到了存储库,你可以通过克隆服务器中的另一个存储库(机器2)来毫不知情地看到它。

机器1中的本地存储库和机器2中的“复制”存储库都是非裸露的。 裸露和非裸露的知识库之间的关系

博客将帮助你理解它。 https://www.atlassian.com/git/tutorials/setting-up-a-repository