2011-10-03 82 views
231

我需要建立一个中央Git仓库,但我有点糊涂了......如何使用“git --bare init”存储库?

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

$ mkdir test_repo 
$ git --bare init 

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

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

让中央仓库拥有裸仓库的正确方法是?

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

回答

298

首先,为了检查,您需要在运行git init --bare之前切换到您创建的目录。另外,传统上给裸仓库扩展.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)从另一个存储库。

请注意,在这种情况下,您需要先让人们推送到您的存储库。里面test_repo.git时,做

git config receive.denyCurrentBranch ignore 

===社区编辑===

git init --bare --shared=group 

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

+5

如果您计划让其他人推送到此回购,您还可以为'init'添加'--shared'选项。它会自动将组写入权限添加到存储库 - [链接](http://git-scm.com/book/en/Git-on-the-Server-Getting-Git-on-a-Server) – prasanthv

+14

我认为这些三条线有比这同样的效果只有一个: 混帐--bare初始化test_repo.git 至少我目前的Git版本(1.8.2.2) –

+1

@Fran不利于1.7 *版本似乎:\ – deepdive

17

这应该是足够了:

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

详情请参见 “GIT: How do I update my bare repo?”。
注:

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

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

纯仓库是具有没有工作树之一。这意味着它的全部内容就是您在.git目录中的内容。

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

要让中央存储库成为拥有bare存储库的唯一途径。

20

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

如果您有SVN背景,可以将SVN回购与Git裸回购关联。它没有原始表单中的回购文件。而您的本地回购将拥有​​形成您的“代码”的文件。

您需要从本地仓库添加一个远程仓库到裸露的仓库,并将“代码”推送给它。

这将是这样的:

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

使用'git remote add central ',在SSH的情况下,这是否也包含路径?例如'git remote add central ssh:// user @ server/home/user/repo.git' –

5

我很高兴验证您确实推动了代码得到了承诺。

通过使用--relative选项显式设置路径,您可以获取裸仓库中更改的日志。

$ cd test_repo 
$ git log --relative=/ 

这将告诉你承诺的变化,就好像这是一个常规的git回购。

20

你也可以问git的为你创建目录:

git init --bare test_repo.git 
151

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

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

我试着在那些不太熟悉git的路上添加一些注释。

1.初始化裸回购...

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

这将创建一个文件夹(repo.git),并与代表一个git仓库git的文件填充它。现在,这个回购没用 - 它没有提交,更重要的是,没有分支。虽然你可以克隆这个回购,但你不能从中获利。

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

2a。通过克隆空回购

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什么也没有返回),到目前为止,没有提交。

接下来,在工作文件夹中复制/移动/创建一些文件,将它们添加到git并创建第一次提交。如果你还没有告诉过git的你是谁,只需要

> cd /path/to/work 
> echo 123 > afile.txt 
> git add . 
> git config --local user.name adelphus 
> git config --local user.email [email protected] 
> git commit -m "added afile" 
[master (root-commit) 614ab02] added afile 
1 file changed, 1 insertion(+) 
create mode 100644 afile.txt 

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 

这也有误导之嫌 - 上游并没有“水涨船高”,它只是尚未创建,git branch --unset-upstream也无济于事。但是,没关系,现在我们已经有了第一次提交,我们可以推送并且掌握将在裸仓库上创建。

> 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 

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

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

2b。从现有文件创建一个工作文件夹 如果你已经有一个文件夹(所以你不能克隆),你可以初始化一个新的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标志设置(新)追踪上游分支。 和以前一样,我们现在有一个功能齐全的裸回购,它可以在主分行的其他地方克隆,也可以在本地工作副本上进行推送。

所有这些对某些人来说似乎都很明显,但git在最好的时候让我感到困惑(这是错误和状态信息确实需要一些返工) - 希望这可以帮助其他人。

+1

有趣。当然比我的回答更详细。 +1 – VonC

+7

这个答案解决了我的问题,应该是被接受的答案,希望越来越多的人可以投票。 – inix

+0

感谢这个有用的答案 –

1

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

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

无论在机器1的本地储存库和在机器2的“复制”存储库都是非裸露。 relationship between bare and non-bare repositories

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

0

基于马克Longair & Roboprog答案:

如果Git版本> = 1.8

git init --bare --shared=group .git 
git config receive.denyCurrentBranch ignore 

或者:

如果Git版本< 1.8

mkdir .git 
cd .git 
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore 
+0

该配置命令:它如何最终应用到刚刚创建的.git目录? – GreenAsJade

+0

我不确定我了解你的问题?你能更精确吗?既然你已经初始化了你的git仓库,你可以用命令'git config'尽可能多地配置它。 – Jack

相关问题