有没有办法从Git中的远程获取引用名称而不获取与这些引用相关联的任何对象?

时间:2014-03-10 05:38:30

标签: git git-fetch

我正在编写一个脚本,该脚本作用于本地仓库,其中远程仓库很大,速度很慢,而且许多分支具有不同的历史记录。典型的用户只关心少数这些分支,所以我想通过不从他们不会使用的分支中获取对象来节省带宽。

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

Git中是否有办法查询远程仓库的所有ref名称(在本例中为几KB),而会导致获取其所有对象的成本(在此案例,几GB)? (FWIW,用户可能正在使用ssh或https网址。)

1 个答案:

答案 0 :(得分:3)

据我所知,git show remote origingit 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存储库,只设置了远程网址,没有别的。

<强> 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)