1

我正在编写一个脚本,它作用于本地存储库,其中远程存储库很大、很慢,并且有许多历史不同的分支。典型的用户只关心这些分支中的一小部分,所以我想通过不从他们不会使用的分支中获取对象来节省带宽。

为此,我希望能够从远程获取 ref 的名称,而无需获取与这些 ref 关联的实际对象。(一旦我有了所有这些 ref 的名称,我计划将该列表呈现给用户并允许他们选择他们想要的分支,这样我就可以以编程方式构建一个非常狭窄的 refspec,其中只包含他们感兴趣的分支.)

Git 中是否有一种方法可以查询远程仓库的所有引用名称(在本例中为几 KB),而不会产生获取其所有对象的成本(在本例中为几 GB)?(FWIW,用户可能使用 ssh 或 https URL。)

4

1 回答 1

3

据我所知,git show remote origin还是git ls-remote可以在一定程度上做到这一点的。您可能需要进行一些额外的过滤或匹配才能获得所需的内容。

下面显示为示例:

$ git remote show origin 
* remote origin
  Fetch URL: git@10.88.1.128:Test
  Push  URL: git@10.88.1.128:Test
  HEAD branch: master
  Remote branches:
    client                      tracked
    develop                     tracked
    index                       new (next fetch will store in remotes/origin)
    master                      tracked
    refs/remotes/origin/masster stale (use 'git remote prune' to remove)
    server                      tracked
    test                        tracked
  Local branches configured for 'git pull':
    masster merges with remote masster
    master  merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date)

index分支是其他人新创建的,没有存储在本地。

编辑:一个更好的例子是一个新创建的 git 存储库,它只设置了远程 url,没有别的。

git ls-remote

$ git init
Initialized empty Git repository in /home/erix/gitRepos/test/.git/
$ git remote add origin git@10.88.1.128:Test
$ git ls-remote origin 
215e658c07c0e667a73ec9247f0b98c90a4fe65a        HEAD
4423ed26d1a74139997ed982cf42d681ea4eb248        refs/heads/client
1c3d2c2113d04d7771a5638729528d090d9a2eae        refs/heads/develop
8277bdd3d37b9a7c02bead816efabc6849290dc1        refs/heads/index
215e658c07c0e667a73ec9247f0b98c90a4fe65a        refs/heads/master
eb26276359ae355486536a4bfe5c939a5ab96fb0        refs/heads/server
62018d80b5d279ee2cbe8175a0bde30121288045        refs/heads/test

git remote show

$ git remote show origin
* remote origin
  Fetch URL: git@10.88.1.128:Test
  Push  URL: git@10.88.1.128:Test
  HEAD branch: master
  Remote branches:
    client  new (next fetch will store in remotes/origin)
    develop new (next fetch will store in remotes/origin)
    index   new (next fetch will store in remotes/origin)
    master  new (next fetch will store in remotes/origin)
    server  new (next fetch will store in remotes/origin)
    test    new (next fetch will store in remotes/origin)
于 2014-03-10T06:03:08.777 回答