首页 > 解决方案 > git - 使用来自裸仓库的远程分支

问题描述

我想用 github 上的一个项目(不是我的)做一些时髦的东西。所以我想基本上克隆它,但我不想有一个工作树......所以这就是我所做的:我在本地创建一个裸仓库,然后我向 github 仓库添加了一个远程。我取了,我得到了那个 repo 包含的所有东西......我是一个快乐的人......直到我想检查可用的分支:

$ git branch -a
$

好吧...这不是我所期待的。如果我尝试检查 repo 中的任何分支(我知道在那里),我只是让 git 告诉我引用不存在:

$ git show --summary origin/master
fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

如何从我的裸仓库中处理来自远程仓库的分支(或实际上任何东西)?

更新

我认为 git 应该能够处理这个问题的假设实际上是正确的。它确实正确地管理它......但是,因为它是一个大项目,git在添加远程后运行提取时失败......并且我之前没有收到该错误消息。:-O

$ git fetch upstream
remote: Enumerating objects: 60400, done.
remote: Counting objects: 100% (60400/60400), done.
remote: Compressing objects: 100% (32/32), done.
Receiving objects: 100% (4133663/4133663), 1.41 GiB | 12.29 MiB/s, done.
remote: Total 4133663 (delta 60370), reused 60389 (delta 60368), pack-reused 4073263
Connection to github.com closed by remote host.
Resolving deltas: 100% (3134856/3134856), done.

所以……总而言之,这显然是我的错。

标签: gitgit-remotegit-bare

解决方案


我在本地创建了一个裸仓库

描述此处使用的确切命令很重要。

通常,人们会创建一个裸镜像克隆:

git clone --mirror <url> foo.git

可以创建一个用于接收git push操作的裸克隆:

mkdir foo.git && cd foo.git && git init --bare

你做了这两个序列之一,还是别的什么?

然后我在 github repo 中添加了一个遥控器

同样,我们需要确切的操作。我不认为git remote add尊重core.bare(它没有在我的本地测试中),但这也可能与 Git 版本有关,因此 Git 版本可能会引起人们的兴趣。

我取...

这是我的测试结果:

$ mkdir tbare
$ git init --bare
Initialized empty Git repository in ...
$ git remote add foo ssh://git@github.com/chris3torek/scripts
$ cat config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = true
[remote "foo"]
        url = ssh://git@github.com/chris3torek/scripts
        fetch = +refs/heads/*:refs/remotes/foo/*

有趣的是,现在在不命名遥控器的情况下进行获取什么也没做。重命名fooorigin,然后获取,得到了东西:

$ git remote rename foo origin
$ git fetch -v
remote: Enumerating objects: 35, done.
[the usual, snipped]
 * [new branch]      master     -> origin/master

这大概是因为git fetch通常会根据当前分支的名称然后其上游设置来选择远程的名称。由于没有当前分支,因此没有上游,这会导致git fetch回退到硬编码的origin. (并且:这个特定系统上的 Git 是 2.27.0。)

使用 创建的镜像克隆git clone --mirror将默认 fetch refspec 设置为+refs/*:refs/*。请注意,--mirror暗示--bare.


推荐阅读