通过慢速网络连接在git中工作的最快方法是什么?

时间:2011-11-02 18:19:24

标签: git vpn

这是一个场景:在工作中我们有很多分支,我们没有像我们应该的那样整理仓库,偶尔添加/删除大文件或什么,并且很少删除死枝。

所以今天是下雪天,我必须在家工作。我有一个缓慢的VPN连接,我所需要的只是最快的方式来到我关心的一个分支并开始工作,能够推送提交。

在SVN中,我刚刚更新了我需要的路径/文件,并且很快就会工作。像大多数git新手一样,我只有一些可信命令,而我的后备git clone或git pull将会太慢。

所以这似乎是一个两部分的问题:

  1. 如何克隆回购以尽快开始工作,
  2. 如何从此回购中提取/推送(编辑,提交,拉取,推送)
  3. 工作解决方案(根据@ g19fanatic的建议):

    > mkdir <project_name>
    > cd <project_name>
    > git clone -b <branchname> <repo_url> --depth=1
    remote: Counting objects: 16679, done.
    remote: Compressing objects: 100% (11926/11926), done.
    remote: Total 16679 (delta 6936), reused 10919 (delta 3337)
    Receiving objects: 100% (16679/16679), 628.12 MiB | 430 KiB/s, done.
    Resolving deltas: 100% (6936/6936), done.
    > git pull
    Already up-to-date.
    

    (在其他机器上进行小改动,提交/推送)

    > git pull
    remote: Counting objects: 5, done.
    remote: Compressing objects: 100% (5/5), done.
    remote: Total 5 (delta 0), reused 0 (delta 0)
    

    很好,这很有用。

    唯一的问题是它最初传输的数据是以下尝试的两倍,但它确实使repo处于可用状态。我会考虑这个问题,但我认为初始传输大小可能有所改善。

    首次尝试失败:

    第1部分似乎最好通过以下方式解决:

    而不是git克隆整个仓库及其所有分支和历史记录,创建一个新的空仓库并获取我关心的一个分支,深度为1(无历史记录):

    mkdir <project_name>
    cd <project_name>
    git init
    git fetch --depth=1 <repo_url> <branchname>:refs/remotes/origin/<branchname>
    git checkout <branchname>
    

    这很棒,因为它执行的网络传输比一个完整的git克隆或拉动所需要的小得多。

    但是现在我遇到了第2部分的问题)从这个浅薄的存储库拉动和推动。我的同事正在全天进行小的更新,就像我一样,所以应该可以快速拉动并推动这些小的增量变化。但是当我尝试将分支设置为跟踪远程时,git pull尝试提取完整的历史记录。即使使用--depth 1运行pull或fetch似乎也希望再次传输整个快照(而不是很少的增量更改)。

    那么在这种情况下我该怎么办? (除了显而易见的 - 清理回购,删除旧的历史项目和枯枝。)

    第二次尝试失败(根据@ g19fanatic的建议):

    根据@ g19fanatic的建议,我使用

    创建了一个回购
    > mkdir <project_name>
    > cd <project_name>
    > git init
    > git remote add origin <repo_url>
    > git pull origin <branchname> --depth=1
    remote: Counting objects: 9403, done.
    remote: Compressing objects: 100% (6675/6675), done.
    remote: Total 9403 (delta 2806), reused 7217 (delta 2136)
    Receiving objects: 100% (9404/9403), 325.63 MiB | 206 KiB/s, done.
    Resolving deltas: 100% (2806/2806), done.
    ...
    

    这创建了一个跟踪分支,并且只正确地提取了1个分支的历史记录(~9400个对象,325MB,而完整的repo是~46k个对象)。然而,再一次,我似乎没有拉动更多的信息,而不是我认为必须拉动。我想我应该能够在几个对象和几千字节中提取我的同事。但这就是我所看到的:

    > git pull origin <branchname>
    remote: Counting objects: 45028, done.
    remote: Compressing objects: ... ^C
    

    这将拉动整个回购中的所有对象,所以我打破了它。我尝试使用--depth = 1参数:

    > git pull origin <branchname> --depth=1
    remote: Counting objects: 9870, done.
    remote: Compressing objects: 100% (7045/7045), done.
    Receiving objects:   4% (430/9870), 4.20 MiB | 186 KiB/s ^C
    

    9k +对象与初始拉力相似,但我给了它一点因为我想也许其中一些对象已经存在于本地。但是,在它传输4+ MB之后,我打破了这个命令,因为它似乎再次进行整个传输。请记住,我希望我的同事可以进行小的更新,而且我没有时间每次都提取300MB。

3 个答案:

答案 0 :(得分:9)

在这里做一点测试,我能够做到以下几点......

我们在网络上有一个共享 - 裸露的回购

我将远程设置为git remote add origin <pathToSharedRepo>
我做git pull origin <branch> --depth=1(不是git fetch而是git pull

这成功地仅为此分支提取了“HEAD + depth”提交。我可以提交到这个,然后推送(git push应该工作得很好)它没有问题就退出了。

从新共享中提取新提交,并且必须明确键入git pull origin <branch>。因为这是我最初做拉(显式)的方式,所以这次我必须这样做......

这不应该比你最初设定的深度(它不关心)下拉历史记录


要完成,您还可以在克隆回购时进行深度设置:
git clone -b <branch> <pathToRepo> --depth=<numCommitsWanted>

答案 1 :(得分:1)

有几种减少带宽的方法:

  • 仅克隆您需要的分支(--single-branch
  • 仅克隆文件的最新版本(--depth 1,就像您所做的一样)。默认情况下,这意味着--single-branch
  • 仅克隆您需要的文件(又称​​稀疏检出,例如here

另外,如果拉取仍然失败,我将使用类似这样的bash脚本来继续重试,直到成功完成:

#!/bin/bash

until $( git pull --depth=1 origin master ); do        # <-- pull command goes here
    echo "Pulling repository failed; retrying..."
done

答案 2 :(得分:0)

此“答案”仅是我为解决该问题而失败的尝试的历史记录(尽管下面的克隆操作传输的数据少于当前工作的解决方案。)


首次尝试失败:

第1部分似乎最好通过以下方式解决:

与其使用git克隆整个仓库及其分支和历史记录,不如创建一个新的空仓库,并以1(无历史记录)的深度获取我关心的一个分支:

mkdir <project_name>
cd <project_name>
git init
git fetch --depth=1 <repo_url> <branchname>:refs/remotes/origin/<branchname>
git checkout <branchname>

这很棒,因为它执行的网络传输比完整的git clone或pull所进行的要小得多。

但是现在我在第2部分)从这个浅存储库中拉出和推送时遇到了问题。和我一样,我的同事每天都在做一些小更新,因此应该有可能快速拉动这些小增量更改。但是,当我尝试将分支设置为跟踪远程服务器时,git pull尝试获取完整的历史记录。甚至使用--depth 1运行pull或fetch似乎都希望再次转移整个快照(而不是小的增量更改)。

那么在这种情况下我该怎么办? (除了显而易见的以外-清理存储库,删除旧的历史记录项和枯死的分支。)

第二次尝试失败(根据@ g19fanatic的以下建议):

遵循@ g19fanatic的建议,我使用创建了一个回购协议

> mkdir <project_name>
> cd <project_name>
> git init
> git remote add origin <repo_url>
> git pull origin <branchname> --depth=1
remote: Counting objects: 9403, done.
remote: Compressing objects: 100% (6675/6675), done.
remote: Total 9403 (delta 2806), reused 7217 (delta 2136)
Receiving objects: 100% (9404/9403), 325.63 MiB | 206 KiB/s, done.
Resolving deltas: 100% (2806/2806), done.
...

这创建了一个跟踪分支,并仅正确提取了1个分支的历史记录(约9400个对象,325MB,而完整回购是约46k个对象)。但是,再说一次,我似乎无法在不拉动更多信息的情况下进行git pull,而我所认为的信息没有必要。我认为我应该能够将我的同事提交的内容拖到几个对象和几千字节中。但是,这是我看到的:

> git pull origin <branchname>
remote: Counting objects: 45028, done.
remote: Compressing objects: ... ^C

这要拉整个回购中的所有对象,所以我把它弄坏了。我用--depth = 1参数尝试了拉动:

> git pull origin <branchname> --depth=1
remote: Counting objects: 9870, done.
remote: Compressing objects: 100% (7045/7045), done.
Receiving objects:   4% (430/9870), 4.20 MiB | 186 KiB/s ^C

9k +个对象将与初始拉动类似,但我给出了一些说明,因为我认为其中一些对象可能已经在本地存在。但是,在传输了4 MB以上的内存之后,我中断了此命令,因为它似乎再次进行了整个传输。记住,我希望我的同事会进行一些小更新,并且我没有时间每次拉出300MB。