什么';通过慢速网络连接在git中工作的最快方式是什么?
情况是这样的:在工作中,我们有相当多的分支机构,我们没有保持回购协议的整洁,偶尔添加/删除大型文件或诸如此类的内容,很少删除死分支机构 所以今天是下雪天,我必须在家工作。我有一个缓慢的VPN连接,我所需要的是以最快的方式到达我关心的一个分支并开始工作,并能够将提交推回 在SVN中,我只需更新所需的路径/文件,就可以立即工作。和大多数git新手一样,我只有少数几个可信任的命令,我的git备份克隆或git拉将太慢 因此,这似乎是一个由两部分组成的问题:什么';通过慢速网络连接在git中工作的最快方式是什么?,git,vpn,Git,Vpn,情况是这样的:在工作中,我们有相当多的分支机构,我们没有保持回购协议的整洁,偶尔添加/删除大型文件或诸如此类的内容,很少删除死分支机构 所以今天是下雪天,我必须在家工作。我有一个缓慢的VPN连接,我所需要的是以最快的方式到达我关心的一个分支并开始工作,并能够将提交推回 在SVN中,我只需更新所需的路径/文件,就可以立即工作。和大多数git新手一样,我只有少数几个可信任的命令,我的git备份克隆或git拉将太慢 因此,这似乎是一个由两部分组成的问题: 如何克隆回购协议以尽快开始工作,以及 如何从该
唯一的问题是,它最初传输的数据是下面的两倍,但它确实让回购处于可用状态。我会考虑这个问题的答案,但我认为初始传输大小可能会有所改进。在这里做一个小测试,我能够做到以下几点 我们在网络上有一个共享的——裸回购协议 我的远程设置为
git remote add origin
我执行一个
git pull origin--depth=1
(不是在git fetch
,而是git pull
)
这将成功地仅提取此分支的“头+深度”提交。我可以对这个和那个做一些承诺,然后将它推出(gitpush
应该可以很好地工作),而不会出现问题
要从共享repo中提取新提交和新提交,我必须显式键入git pull origin
。因为这是我最初做拉(显式)的方式,所以这次我必须做同样的事情
这不应该比您最初设置的深度更深入地分析历史(它不在乎)
完整地说,您还可以在克隆回购协议时进行深度设置:
git clone-b--depth=
有几种方法可以减少带宽:
- 仅克隆所需的分支(
,此分支仅用于克隆,不用于拉取;拉取时,可以指定所需的分支)--单分支
- 仅克隆文件的最新版本(
,就像您所做的那样)。默认情况下,这意味着--depth 1
--单分支
- 仅克隆您需要的文件(又称稀疏签出,如)
#!/bin/bash
until $( git pull --depth=1 origin master ); do # <-- pull command goes here
echo "Pulling repository failed; retrying..."
done
#/bin/bash
直到$(git pull--depth=1原始主机);多谢
这个“答案”仅仅是我自己解决这个问题的失败尝试的历史记录(尽管下面的克隆操作传输的数据少于当前的工作解决方案)
第一次失败的尝试:
第一部分。似乎最好的解决方法是:
与git克隆整个回购协议及其所有分支和历史记录不同,创建一个新的空回购协议并获取我关心的一个分支,深度为1(无历史记录):
mkdir
光盘
初始化
git fetch--深度=1:refs/remotes/origin/
git签出
这很好,因为它执行的网络传输比完整的git克隆或pull要小得多
但是现在我在第二部分中遇到了问题,从这个浅存储库中拉和推。我的同事整天都在做一些小的更新,我也是,所以应该可以快速地拉动和推动这些小的增量更改。但是,当我试图将分支设置为跟踪远程对象时,git pull会尝试提取完整的历史记录。即使使用--depth 1运行pull或fetch,似乎也希望再次传输整个快照(而不是少量增量更改)
那么在这种情况下我能做什么呢?(除了显而易见的——清理回购协议,删除旧的历史项目和死分支。)
第二次尝试失败(根据@G19Fantaic的以下建议):
按照@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.
...
>mkdir
>光盘
>git初始化
>git远程添加源
>git pull原点--深度=1
远程:计数对象:9403,完成。
远程:压缩对象:100%(6675/6675),完成。
远程:总计9403(增量2806),重复使用7217(增量2136)
接收对象:100%(9404/9403),325.63 MiB | 206 KiB/s,完成。
解析增量:100%(2806/2806),完成。
...
这创建了一个跟踪分支,并且只正确地提取了1个分支的历史记录(~9400个对象,325MB,而完整的repo是~46k个对象)。然而,再一次,如果不获取比我认为需要获取的信息更多的信息,我似乎无法git pull。我想我应该能够在几个对象和几千字节内提取我的同事提交的内容。但我看到的是:
> git pull origin <branchname>
remote: Counting objects: 45028, done.
remote: Compressing objects: ... ^C
>git拉入原点
远程:计数对象:45028,完成。
远程:压缩对象:^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
>git pull原点--深度=1
远程:计数对象:9870,完成。
远程:压缩对象:100%(7045/7045),完成。
接收对象:4%(430/9870),4.20 MiB | 186 KiB/s^C
9k+对象将类似于初始拉力,但我给出了一点,因为我认为其中一些对象可能已经在本地存在。然而,在它传输了4+MB之后,我破坏了这个命令,因为它似乎再次进行了整个传输。请记住,我希望同事提供一些小的更新,但我没有时间每次提取300MB。我的本地回购设置如下:mkdir newRepo;cd newRepo
然后是git init
然后是git remote添加…所以我
mkdir <project_name>
cd <project_name>
git init
git fetch --depth=1 <repo_url> <branchname>:refs/remotes/origin/<branchname>
git checkout <branchname>
> 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.
...
> git pull origin <branchname>
remote: Counting objects: 45028, done.
remote: Compressing objects: ... ^C
> 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