有没有办法将一个Git回迁拆分为多个较小的回迁?

有没有办法将一个Git回迁拆分为多个较小的回迁?,git,Git,我需要将VPN接入我们的Git服务器以获取更改,VPN连接速度非常慢(~200kbps)。我正试图进行几个月的更改,但它的文件容量为3GB,VPN连接在完成所有更改之前一直处于断开状态 我想知道是否有一种方法可以一次只提取一半的更改,这样我就可以将其分为两个批次?分割一个大的获取的关键是获取带来提交。一个获取操作要么成功,要么完全失败,如果网络连接在中间抛出。但是,如果您的git fetch想要引入(比如)16384个提交,这将带来价值3 GB的数据,而这些数据不会一次全部完成,您可以将其分解:

我需要将VPN接入我们的Git服务器以获取更改,VPN连接速度非常慢(~200kbps)。我正试图进行几个月的更改,但它的文件容量为3GB,VPN连接在完成所有更改之前一直处于断开状态


我想知道是否有一种方法可以一次只提取一半的更改,这样我就可以将其分为两个批次?

分割一个大的获取的关键是获取带来提交。一个获取操作要么成功,要么完全失败,如果网络连接在中间抛出。但是,如果您的
git fetch
想要引入(比如)16384个提交,这将带来价值3 GB的数据,而这些数据不会一次全部完成,您可以将其分解:

  • 首先,引入8192个提交,带来1.5GB的数据
  • 然后引入其余的8192个提交,这些提交将引入其他1.5 GB的数据
如果这还不够小,继续将提交分解为越来越小的提交集

不过,这个计划有一个主要缺陷。如果16383次提交带来了500个MiB的文件,那么其中一次提交16384次提交带来了2.5 GiB的文件。你不能把它拆开

另外,您可能无论如何都无法以这种方式选择提交,因为许多服务器不允许您按原始哈希ID运行
git fetch
。二!这项计划有两大缺陷

说真的,如果您拥有正确的访问权限,您可以让某人针对各种提交放置分支名称或标记名称,并以这种方式分解大量提交。这让你陷入了一个可能的主要缺陷

Edit:您也可以从相反的方向进行操作:使用
--depth
选项运行
git fetch
--depth=1
尝试只获取每个分支名称的最后一次提交,
--depth=2
尝试获取最后两次提交,以此类推)。然后,您可以使用
--decept
运行额外的获取操作,并且一旦有足够的操作,就可以使用
git fetch--unshall
获取所有其他操作。这可能是最简单的工作,从你的目的单独

或者,让某人运行
git bundle
并创建一个bundle文件。然后,使用一些可重启的传输协议发送文件。获得整个文件后,对bundle文件运行
git fetch
。捆绑文件只需将
git fetch
拆分为不同的部分:

  • 聚合传输所需的对象(
    git bundle
    完成此部分)
  • 传输捆绑文件(这部分由您自己完成);及
  • 将捆绑包文件提取到提交中(
    git fetch
    知道如何做)

在StackOverflow上有许多关于
git bundle
的问题和答案;请参阅,例如,

我认为它会自动恢复到中断时离开的位置。@mkrieger1:不幸的是,不会。相关XKCD:噢,git捆绑包听起来非常适合未来(每次我们添加新的团队成员时,这整件事都很痛苦,他们必须从头开始提取文件)。但对于第一个解决方案,我愿意冒险,因为在超时之前我确实非常接近(比如80-90%)。。。那么我该如何像你提到的那样拆分它呢?@AdamL.:好吧,棘手的部分是弄清楚提交的
git fetch
是什么,然后在另一个git中放置一个分支或标记名,这样你就可以
git fetch origin
来获取“前半部分”或“前10%”或其他内容。没有完美的方法可以做到这一点;最好的办法是记下Git中远程跟踪名称的散列ID,登录到另一台机器(或以其他方式获得对它的访问权),然后在Git存储库中运行
Git log
,查看它们有哪些提交,你不知道。@torek我可以通过散列ID进行获取吗?你可以尝试
--depth=1
获取和重复
--deeph=
获取。。。