git remotes 分支克隆

32 天前
 huangya
在我的 A linux 机器上有个 git 仓库,里面含有 remotes 分支和已经 checkout 的分支。现在我从 B 机器上 clone 这个仓库,似乎 remotes 分支没有 clone 过去。请问该如何操作?我现在有个粗糙的方法是 scp A 上 git 仓库的.git 文件夹,但似乎不是很优雅。

我说的 remote 分支和已经 checkout 的分支的例子:
tony@tony-EQ1:/project/openwrt/trunk$ git branch -a
* master
openwrt-22.03
openwrt-23.05
remotes/origin/HEAD -> origin/master
remotes/origin/lede-17.01
remotes/origin/master
remotes/origin/openwrt-22.03
remotes/origin/openwrt-23.05
remotes/origin/openwrt-24.10

其中 master ,openwrt-22.03 ,openwrt-23.5 为已经 checkout 的分支,其余为 remote 分支,还没有被 checkout 。
1391 次点击
所在节点    git
5 条回复
beyondstars
32 天前
加上 `--mirror` 参数,至于为什么参考 git-clone(1) man page.
unclejimao
32 天前
A linux 机器上的 ./git/refs/remotes 目录是远端仓库(相对机器 A 来说,比如 github 仓库)分支的引用,
./git/refs/head 目录下是本地分支的引用,git clone 命令会传输 ./git/refs/head 目录以及./git/refs/tags 目录下的对象,然后再克隆目的地**重建** ./git/refs/remotes 目录。
具体到你的例子,从 github clone 代码到机器 A 时,master ,openwrt-22.03 ,openwrt-23.05 等这些分支都是 github 的本地分支,其引用在 github 的./git/refs/head 目录下,git clone 命令会处理这个目录并传输这些对象到机器 A ,而并不会处理 github 机器上 ./git/refs/remotes 目录的内容;对于机器 A 来说,clone 之后,本地./git/refs/head 目录会生成一个机器 A 自己的本地分支,通常是 clone 时远端仓库 checkout 的分支(比如 master ),而 github 的其他本地分支 openwrt-22.03 ,openwrt-23.05 等对机器 A 来说是远端分支,因此,这些分支的引用会被创建(重建而非复制)在机器 A 的 ./git/refs/remotes 目录,你在机器 A 上通过 git checkout -b 创建的新分支是机器 A 的本地分支,其引用保存在./git/refs/head 目录。

当你把机器 A 当做远端仓库,机器 B 当做目的地仓库时,被处理的是机器 A 的 ./git/refs/head 目录,所以 clone 的结果是:
假设 clone 执行时机器 A checkout 的分支为 bra-X ,那么在机器 B 的./git/refs/head 目录会有一个 bra-X 的本地分支,而机器 A 的其他分支比如 master ,openwrt-22.03 ,openwrt-23.05 等的引用都会被重建在机器 B 的./git/refs/remotes 目录。
huangya
32 天前
@beyondstars 发帖之前,我就加了--mirror 参数后,得到的是一个纯裸仓库。但后续操作如何弄呢?从纯裸仓库克隆再克隆一次的话,remote 仓库又不见了。以下是我在 B 机器上的操作:

tony@tony-2204-dt:/tmp$ git clone --mirror ssh://10.40.18.171/project/openwrt/trunk
克隆到纯仓库 'trunk.git'...
tony@10.40.18.171's password:
remote: Enumerating objects: 728729, done.
remote: Counting objects: 100% (728729/728729), done.
remote: Compressing objects: 100% (194406/194406), done.
remote: Total 728729 (delta 504789), reused 728068 (delta 504128), pack-reused 0
接收对象中: 100% (728729/728729), 245.14 MiB | 16.86 MiB/s, 完成.
处理 delta 中: 100% (504789/504789), 完成.

tony@tony-2204-dt:/tmp$ cd trunk.git/
tony@tony-2204-dt:/tmp/trunk.git$ ls
branches config description HEAD hooks info objects packed-refs refs
tony@tony-2204-dt:/tmp/trunk.git$ git branch
* master
openwrt-22.03
openwrt-23.05
tony@tony-2204-dt:/tmp/trunk.git$ git branch -a
* master
openwrt-22.03
openwrt-23.05
remotes/origin/HEAD
remotes/origin/lede-17.01
remotes/origin/master
remotes/origin/openwrt-22.03
remotes/origin/openwrt-23.05
remotes/origin/openwrt-24.10

tony@tony-2204-dt:/tmp/trunk.git$ cd ..

tony@tony-2204-dt:/tmp$ git clone trunk.git/ trunk-clone-raw.git
正克隆到 'trunk-clone-raw.git'...
完成。
tony@tony-2204-dt:/tmp$ cd trunk-clone-raw.git

tony@tony-2204-dt:/tmp/trunk-clone-raw.git$ ls
BSDmakefile config Config.in COPYING feeds.conf.default include LICENSES Makefile package README.md rules.mk scripts target toolchain tools

tony@tony-2204-dt:/tmp/trunk-clone-raw.git$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/openwrt-22.03
remotes/origin/openwrt-23.05
skiy
32 天前
--bare 或者 --mirror

推送时,git push xxxx.git https://xxx.com/owner/repo.git --all
yuedashi
31 天前
不是专门搭的 git 服务器,正确方法就是 scp .git

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1139062

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX