V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
huangya
V2EX  ›  git

git remotes 分支克隆

  •  1
     
  •   huangya · 31 天前 · 1387 次点击
    在我的 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 。
    5 条回复    2025-06-18 08:39:20 +08:00
    beyondstars
        1
    beyondstars  
       31 天前
    加上 `--mirror` 参数,至于为什么参考 git-clone(1) man page.
    unclejimao
        2
    unclejimao  
       31 天前
    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
        3
    huangya  
    OP
       31 天前
    @beyondstars 发帖之前,我就加了--mirror 参数后,得到的是一个纯裸仓库。但后续操作如何弄呢?从纯裸仓库克隆再克隆一次的话,remote 仓库又不见了。以下是我在 B 机器上的操作:

    tony@tony-2204-dt:/tmp$ git clone --mirror ssh://10.40.18.171/project/openwrt/trunk
    克隆到纯仓库 'trunk.git'...
    [email protected]'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
        4
    skiy  
       31 天前 via iPhone
    --bare 或者 --mirror

    推送时,git push xxxx.git https://xxx.com/owner/repo.git --all
    yuedashi
        5
    yuedashi  
       30 天前 via Android
    不是专门搭的 git 服务器,正确方法就是 scp .git
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1158 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:44 · PVG 07:44 · LAX 16:44 · JFK 19:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.