你如何使用“git --bare init”存储库?

时间:2011-10-03 08:05:29

标签: git

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

我用:

创建了一个裸存储库(在我的git服务器,机器2中)
$ mkdir test_repo
$ git --bare init

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

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

是否拥有一个拥有裸存储库的中央存储库的正确方法?

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

10 个答案:

答案 0 :(得分:346)

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

git init --bare test_repo.git

对于Git版本< 1.8你会做什么

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

为了回答您以后的问题,裸存储库(根据定义)没有附加工作树,因此您无法像在普通的非裸存储库中那样轻松地向其添加文件(例如{ {1}}以及随后的git add <file>。)

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

请注意,在这种情况下,您需要首先允许人们推送到您的存储库。在git push内时,请执行

test_repo.git

社区编辑

git config receive.denyCurrentBranch ignore

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

答案 1 :(得分:202)

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

注意:此示例使用本地路径作为裸存储库的位置,但其他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 repo的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并创建第一个提交。

> 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

这也是误导性的 - 上游没有&#34;消失了#34;它还没有被创建,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 repo,添加第一个提交,然后将它链接到裸存储库。

> 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 push上的-u标志以设置(新)跟踪的上游分支。 和以前一样,我们现在有一个功能齐全的裸仓库,可以在主分支上的其他地方克隆,也可以在本地工作副本上进行拉动和推送。

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

答案 2 :(得分:32)

逐一回答您的问题:

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

您只能commit通过push从您的本地克隆裸设备存储库。它没有工作树,因此没有修改文件,也没有修改。

让中央存储库成为拥有bare存储库的唯一方式。

答案 3 :(得分:21)

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

git init --bare test_repo.git

答案 4 :(得分:20)

通常的做法是将中央存储库作为一个裸仓库推送。

如果你有SVN背景,你可以将SVN仓库与Git裸仓库联系起来。它没有原始格式的repo中的文件。而您的本地仓库将拥有构成“代码”的文件。

您需要从本地仓库向裸仓库添加一个遥控器并将“代码”推送到它。

这将是:

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

答案 5 :(得分: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

答案 6 :(得分:5)

很高兴验证您推送的代码实际上已提交。

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

$ cd test_repo
$ git log --relative=/

这将显示已提交的更改,就好像这是一个常规的git repo。

答案 7 :(得分:4)

基于Mark Longair&amp; Roboprog回答:

如果git版本&gt; = 1.8

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

或者:

如果git版本&lt; 1.8

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

答案 8 :(得分:2)

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

例如,当您在本地存储库(计算机1)中添加文件并将其推送到裸存储库时,您无法在裸存储库中看到该文件,因为它始终为“空”。但是,您确实将某些内容推送到存储库,您可以通过克隆服务器中的另一个存储库(机器2)来明确地看到它。

计算机1中的本地存储库和计算机2中的“复制”存储库都是非裸机。 relationship between bare and non-bare repositories

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

答案 9 :(得分:-2)

您可以执行以下命令来初始化本地存储库

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

您应该从本地存储库处理项目,并将服务器用作中央存储库。

您还可以按照本文介绍创建和维护Git存储库的各个方面。 Git for Beginners