从本地开始的集中 Git 存储库

Centralized Git repository starting from local

假设我想用类似 SVN 的工作流程建立一个 Git 存储库(因此每个开发人员都参考 URL 上的集中存储库)。

我知道您可以无限制地推送到 Bare 存储库(但组权限等),但您不能在不使用强制选项的情况下推送到 Bare 存储库。所以像中央存储库这样的 "SVN" 应该被初始化。 我理解的对吗?

现在,我想知道从已经有 git 存储库(还没有克隆也没有远程 link)的本地文件夹生成集中存储库的最短方法是什么,源文件,并且可能有超过 1 个分支。

目前我使用以下方法,但我不确定是否足够:

在远程文件夹上 my_project.git :

并且现在只在本地文件夹 my_project 上使用现有的 repo :

够了吗?

当我在另一个地方克隆集中式仓库时,新的仓库似乎并不完全等同于原始的本地副本。当使用 git branch -a 命令时,我有两个不同的结果,我的 git 知识目前还不足以理解发生了什么。

在原始本地存储库上:

> git branch -a
* master
  remotes/origin/master

在从集中远程克隆的本地存储库上:

> git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

两个副本看起来不一样究竟是怎么回事?

提前致谢。

So a "SVN" like central repository should be initialized bare. Did I understood that properly ? Pushing to a bare repository (without any working tree checked out, which might be impacted by the push) is the best practice.

git init --bare; 
# local: 
git remote add origin url_to_my_project.git
git push -u --all

Is this enough ?

是的。
如果你有一个监听器:ssh daemon(如“Getting Git on a Server") or HTTPS server (used for smart HTTP

中提到的

When I clone the centralized repo on another local place, the new repo does not seems strictly equivalent than the original local copy.
When using git branch -a command, I have two different results,

这是预期的:

  • git push --all 确实将所有分支推送到 refs/heads/
    The -u part adds upstream (tracking) reference, used by argument-less git pull等命令。

  • git branch -a 在你的第二个克隆上确实列出了 symbolic branch referenced by your remote repo.
    origin/HEAD 代表 the default branch on the remote repository 你刚刚克隆。
    第一个存储库(你推送的)不知道的东西,因为你正在推送到一个空的存储库(还没有默认分支)

远程存储库上的分支重命名为 remote/<remote-name>/<branch-name> 本地副本(默认情况下)以避免本地和远程存储库之间的名称冲突。

如果您想要类似 SVN 的行为(即共享相同的分支命名空间),您可以根据需要编辑 .git/config 上的映射:

# default configuration ('master' branch on remote corresponds to 'remotes/origin/master' branch on local)
[remote "origin"]
    url = git@github.com:example/url_to_my_project.git
    fetch = +refs/heads/master:refs/remotes/origin/master

例如:

# SVN-like configuration ('master' branch on remote corresponds to 'master' branch on local)
[remote "origin"]
    url = git@github.com:example/url_to_my_project.git
    fetch = +refs/heads/master:refs/heads/master

也就是说,这不是推荐的也不是可扩展的方式,因为您需要在存储库的每个克隆上配置此映射。

有关详细信息,请参阅 the refspec section on the Git Book and