如何在裸存储库之间同步 git 分支?

pet*_*ica 5 git

我有一个裸存储库,它origin在远程机器上。

我想将其分支下载到本地裸仓库中。即我想git branch -vva在分支列表中使用命令查看它们,如下所示:

* master                0bc84f0 [origin/master] something...
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 0bc84f0 something...
Run Code Online (Sandbox Code Playgroud)

在非裸git pull --all存储库的情况下,分支也同步(它使远程分支在本地存储库中可见),但在裸存储库的情况下,拉取是不可能的。

在这种情况下如何同步远程分支?


注意:git --fetch不起作用,远程分支在它之后仍然不可见:

$ git remote -v
origin  git://host/project.git (fetch)
origin  git://host/project.git (push)
$ git branch -vva
* master 4085a31 ...something
$ git fetch
From git://host/project.git
 * branch            HEAD       -> FETCH_HEAD
$ git branch -vva
* master 4085a31 ...something
Run Code Online (Sandbox Code Playgroud)

附加信息:我config的如下:

[core]
        repositoryformatversion = 0
        filemode = false
        bare = true
        symlinks = false
        ignorecase = true
[remote "origin"]
        url = git://host/project.git
Run Code Online (Sandbox Code Playgroud)

config在一个新克隆的(也是裸的)repo 中:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
[remote "origin"]
        url = git://host/project.git
Run Code Online (Sandbox Code Playgroud)

yab*_*aba 7

解决方案#1:

您需要将您的仓库转换为镜像仓库:

git remote add --mirror=fetch origin <url>
git fetch
Run Code Online (Sandbox Code Playgroud)

镜像仓库将在获取后保持与原始引用同步的本地引用。它有一个缺点,即镜像应该是远程仓库的精确副本,这可能不是您的目标。


解决方案#2:

(使用评论从@peterh 扩展):

在 git config 中(只是repo/config在裸仓库的情况下),一个

[remote "origin"]
  fetch = +refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)

应该存在。如果没有,它可能是一个重要的 git 功能,或者一个 git 错误。您可以手动修复它。之后,git fetch将工作。


Von*_*onC 5

Agit fetch应该就够了。

仅用于测试,只需尝试再次将您的裸存储库克隆到新的本地存储库中。然后查看远程跟踪分支是否存在。

git clone git://host/project.git newproject
cd newproject
git branch -avv
Run Code Online (Sandbox Code Playgroud)

我做了一个新的克隆,尽管原点指向正确的 url,但我仍然看不到任何远程分支。
情况仍然是一样的,正如你在我的问题末尾看到的那样(正确的原始 URL,但仍然没有远程分支)

这意味着这些远程分支一开始就不在远程存储库中。克隆的默认获取引用规范

fetch = +refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)

如果远程存储库有任何其他分支,它们也会被克隆。

如果配置未显示任何fetch键(如 所示git config -l),请尝试添加一个:

git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)

检查一下:

git config --get remote.origin.fetch
Run Code Online (Sandbox Code Playgroud)

更多信息请参阅“git fetch不获取所有分支”。


那么真正的问题就变成了:OP 的配置中的什么使git clone克隆仅成为 master 并且不包含 fetch refspec?

也许设置了 Git 环境变量
例如,GIT_TEMPLATE_DIR(其中包括默认配置)

简单地添加 fetch refspec 并不能解决实际问题。
为了解决实际问题,需要更多信息(Git 版本、操作系统版本……)