问题描述
我有一个供学生使用的公共资源库,其中推送了一个大数据集和一些更正。问题是目前我们在这里遇到风暴,连接真的很差。此外,学生已经为练习目的自行下载了数据集。
我的问题,我想不出一个简单的解决方案:他们是否有办法在没有数据集的情况下(仅在那个时候)拉回购协议,并且在下次拉回时只要连接恢复,他们将能够拉动一切。
我当时以为git fetch
+ git merge
只需要文件,但这并不是我想要的,因为理想情况下,它将是git fetch
+ git merge
,不包括一个文件夹(数据文件夹)。
希望我的问题很清楚,并且有一个简单的解决方案! 谢谢您的帮助
解决方法
Pull只是获取+合并(或获取+变基);这是获取新Git对象的获取步骤。
获取基于逐次提交进行。如果对象是所需提交的一部分,则学生将获得整个提交,或者根本不获得该提交。 1 然后,诀窍是创建一些 new和不同的提交,更容易获得,并提供您的学生所需的内容。
要这样做:
-
在已添加大型数据集的提交之前找到提交。该提交具有一些哈希ID
$hash
。 -
创建一个新分支名称指向此提交:
git branch newbranch $hash
根据需要从此处进行新提交,例如,向文件添加更正,但不添加添加大数据集。
-
让学生获取正是这个分支:
git fetch origin newbranch
,然后签出这个新分支并在那里工作。
-
稍后,当情况良好时,将具有大量数据的主分支合并到新分支中:
git checkout newbranch; git merge mainbranch
从此处继续使用新分支:您甚至可以立即完全删除旧的主分支。现在,新分支成为主分支。
从理论上讲,我们正在这样做。我们从以下内容开始:
...--F--G--H--I--J <-- main
其中提交H
是我们关心的哈希值:在提交I
中添加大数据之前。提交J
可能存在或可能不存在:如果不存在,则提交I
是主分支上的最后一个提交。提交I
和J
中都包含大文件,因此,如果有人去获取提交J
或提交I
,他们将获取所有数据。因此,我们添加了一个新的名称,它指向提交H
:
I--J <-- main
/
...--F--G--H <-- newbranch
现在,我们从I
和/或J
中获取我们想要的任何更新,并使用这些更新来更新一些文件并进行新的提交快照K
:
I--J <-- main
/
...--F--G--H------K <-- newbranch
提交K
没有大文件。通过避免获取I
和J
,无需等待大文件。
任何其他工作都会添加更多提交:
I--J <-- main
/
...--F--G--H--K--L <-- newbranch
这很好,最终我们用git merge
将大文件放入其中:
I----J <-- main
/ \
...--F--G--H--K--L--M <-- newbranch
,因此提交M
具有大文件。现在,我们删除名称main
,因为它对任何人都不再有用:
I----J
/ \
...--F--G--H--K--L--M <-- newbranch
照常将新提交添加到newbranch
中;大数据文件通过提交I
到达;并且在M
处没有合并冲突,或者如果存在,您通过从提交L
中获取适当的文件来解决它们;没有其他人必须解决任何问题。
1 在非常现代的Git版本中,是的一项新功能,该功能允许部分提取单个提交。但是,使用它是棘手的,不是正确的方法来完成您想要的事情。