git pull不包括某些文件?

问题描述

我有一个供学生使用的公共资源库,其中推送了一个大数据集和一些更正。问题是目前我们在这里遇到风暴,连接真的很差。此外,学生已经为练习目的自行下载了数据集。

我的问题,我想不出一个简单的解决方案:他们是否有办法在没有数据集的情况下(仅在那个时候)拉回购协议,并且在下次拉回时只要连接恢复,他们将能够拉动一切。

我当时以为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是主分支上的最后一个提交。提交IJ中都包含大文件,因此,如果有人去获取提交J或提交I,他们将获取所有数据。因此,我们添加了一个新的名称,它指向提交H

             I--J   <-- main
            /
...--F--G--H   <-- newbranch

现在,我们从I和/或J中获取我们想要的任何更新,并使用这些更新来更新一些文件并进行新的提交快照K

             I--J   <-- main
            /
...--F--G--H------K   <-- newbranch

提交K没有大文件。通过避免获取IJ,无需等待大文件。

任何其他工作都会添加更多提交:

             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版本中,的一项新功能,该功能允许部分提取单个提交。但是,使用它是棘手的,不是正确的方法来完成您想要的事情。