通过http克隆时Git远程分支缺失,但在远程机器本地克隆时可用。

4

我很长时间以来都卡在这个问题上。我相信这是从迁移svn时出现错误引起的。

在裸仓库所在的服务器上:

$ git clone /var/git/queryj.git
$ cd queryj
$ git branch -r

origin/HEAD -> origin/remotes/trunk
origin/br-0_6--ventura24-2_0-5
origin/master
origin/remotes/br-0_6--ventura24-1_0
origin/remotes/br-0_6--ventura24-1_9-stable
origin/remotes/br-0_6--ventura24-1_9-synchr
origin/remotes/br-0_6--ventura24-2_0
origin/remotes/br-0_6--ventura24-2_0-0

当通过https克隆代码库时,我得到了不同的结果:
$ git clone https://git.acm-sl.org/queryj.git
$ cd queryj
$ git branch -r

origin/HEAD -> origin/remotes/trunk
origin/br-0_6--ventura24-2_0-5
origin/remotes/trunk
origin/ventura24-2_0-stable

有什么办法可以在通过https克隆时使丢失的分支可用吗?它通过webdav导出。


阅读了这篇文章之后,修复方法很简单:在服务器上:git clone /var/git/queryj.git for remote in $(git branch -r); do git checkout -b $remote $remote; done git push --mirror 现在本地机器上的新克隆可以看到预期的远程分支。最终完成。 - chous
可能是Git不会在后续克隆中克隆所有分支?的重复问题。 - user456814
可能是Migrate SVN repository with history to a new Git repository的重复问题。 - user456814
2个回答

1

git clone 默认不会为所有远程跟踪分支创建本地分支。

列出 Git 对象时,不要忘记使用git for-each-ref--format 选项实际上可以是一个完整的脚本。

例如,要创建本地分支(尚不存在的本地分支)并将其上游分支设置为给定的远程分支(同时使用 "有没有更好的方法找出本地 git 分支是否存在?"):

#!/bin/bash

aremote=$1
fmt='r=%(refname); T=$(r#refs/remotes/$aremote/}
if [[ "$T" != HEAD ]]; then
  git show-ref --verify --quiet refs/heads/$T
  res=$?
  if [[ "$res" != "0" ]] ; then git branch --set-upstream $T $aremote/$T ; fi
fi
'
e=`git for-each-ref --shell --format="$fmt" refs/remotes/$aremote`
eval "e"

您可以使用远程名称作为参数来运行该脚本。


0

通过HTTP克隆(无需使用智能服务器)使用了一些从存储库的其余部分生成的额外元数据。这些元数据需要手动更新,您可以通过运行git update-server-info来执行此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接