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



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

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

$ mkdir test_repo
$ git --bare init

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

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

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

我对这个题目有点困惑。请给我一点提示。

首先,为了检查一下,您需要切换到运行git init --bare之前创建的目录。另外,通常给裸存储库提供扩展名.git。所以你可以输入

git init --bare test_repo.git

对于Git版本<你会做>

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评论的那样,如果你在工作中做这个,这是你想要的,而不是私人家庭项目。

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

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

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

1。初始化裸repo

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

这将创建一个文件夹(repo.git),并在其中填充代表git repo的git文件。就目前而言,这个repo毫无用处——它没有提交,更重要的是,没有分支。虽然你可以克隆这个仓库,但是你不能从里面拉。

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

2 a。通过克隆空的repo

创建一个新的工作文件夹(不存在文件)
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 config命令只有在你还没有告诉git你是谁的时候才需要。注意,如果现在运行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也帮不了你。但是没关系,现在我们已经完成了第一次提交,我们可以推送,master将在裸repo上创建。

> 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
在这一点上,我们有一个功能齐全的裸repo,可以克隆到主分支的其他地方,以及一个本地工作副本,可以拉和推。
> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2 b。从现有文件创建一个工作文件夹如果你已经有一个包含文件的文件夹(所以你不能克隆到它),你可以初始化一个新的git repo,添加第一次提交,然后链接到裸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标志来设置(新的)跟踪的上游分支。就像以前一样,我们现在有了一个功能齐全的裸repo,它可以在主分支的其他地方克隆,也有一个本地工作副本,可以拉和推。

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

一一回答你的问题:

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

您只能通过push从本地克隆到裸存储库来commit。它没有工作树,所以没有任何文件被修改,没有任何变化。

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

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

git init --bare test_repo.git

一般做法是将您推送到的中央存储库作为裸repo。

如果你有SVN后台,你可以把SVN的repo和Git的裸repo关联起来。它没有原始形式的回购文件。而你本地的repo还会有组成你的"代码"的文件。

你需要从本地repo添加一个远程到裸repo,并将你的"代码"推送到它。

应该是这样的:

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 '不同的名称作为裸repo远程引用。
  • 这不会推送你的标签,你需要一个单独的git push --tags origin

基于Mark Longair &Roboprog回答:

if git version>= 1.8
git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

或:

if git version;1.8

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

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

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

$ cd test_repo
$ git log --relative=/

这将显示提交的更改,就像这是一个常规的git仓库一样。

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

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

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

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

机器1中的本地存储库和机器2中的'copy'存储库都是非裸的。裸和非裸存储库之间的关系

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

最新更新