【问题标题】:Git sub branch or similar conceptGit子分支或类似概念
【发布时间】:2015-07-15 01:51:14
【问题描述】:

git 是否支持子分支的概念?即一个分支的一个分支

例如,一组教师在网络驱动器上有一个裸共享存储库(没有服务器 ssh 身份验证等),他们在适当的时候将其拉入并推送到共享驱动器上并合并到主驱动器上。

此 repo 将包括教师文件,例如工作解决方案以及学生文件。

学生不应克隆此存储库,也不应直接查看他们各自的教师分支,因为它包含答案。

但 repo 可能包含每个班级/主题的分支,其中只有学生文件跟踪上游更改。学生然后分支这个分支来做他们的工作。老师作为远程跟踪学生分支并拉入工作。

我最接近上述的方法是将单个分支克隆到单独的存储库中,并在该存储库中设置学生分支。上述问题包括明显的数据重复(Windows 对 git 中的系统链接的支持很差)和额外的类/主题存储库必须随上游更改保持更新。

任何想法如何更好地支持 Git/LibGit2 中的这个工作流程?

【问题讨论】:

    标签: git


    【解决方案1】:

    我使用类似的流程,但有两个不同的历史记录(即两个没有任何共同提交的不同存储库):一个用于教师,一个用于学生。拥有两个独立的历史有几个优点:

    • 我可以在学生的存储库中包含生成的文件(例如 *.pdf),并在教师的存储库中跟踪源文件(例如 *.tex)。

    • 我不需要在学生的存储库中显示教师所做的个人提交。他们只是看到每个班级约 1 次提交说“新班级在线”。

    • 我选择了要发布的文件。

    在我老师的存储库中,我有一个带有 make install 目标的生成文件,它将生成的文件复制到学生的存储库。为方便起见,我在学生的结帐中设置了运行 git commit 和 git push 的目标 make git-commit、make git-push。

    在学生方面,他们运行git clone 一次,git pull 每当我添加新内容时。他们可以将我的存储库用作他们实验室工作的骨架,并进行协作(我建议他们为同事使用一个遥控器,为我使用一个遥控器)。

    【讨论】:

    • 这最能代表所需的工作流程,但我将结合上述命名空间,不同的学生群体学习相同的主题,例如扩展核心计算的高级计算。
    【解决方案2】:

    git 是否支持子分支的概念?即一个分支的一个分支

    不,可以随时重命名、删除或重新定位(即移动)分支。

    它确实支持“命名空间”(或hierarchy,或group)的概念,分支名称包括一个或多个“/”:class/topic 可以是分支的名称.

    您会发现命名空间与 gitolite(一种基于身份验证控制对 Git 存储库的访问的 ACL)类似。
    见:

    【讨论】:

    • gitolite 看起来是一个非常可行的解决方案,不幸的是,在我的特殊情况下,我没有端口访问权限,也没有服务器权限来设置任何类型的服务器。我将测试建议的命名空间方法 ITCRepo/TeacherBranch/StudentSubBranch/Class/Student
    • @ArchNemSyS 我只提到 gitolite 是为了说明名称中带有“/”的分支的用法。这是建议您应该使用授权层。
    【解决方案3】:

    git 中没有主分支的概念(master 是 git 默认提供的完全正常的分支)。你可以从master分支出来,你可以从任何其他分支分支出来,你可以从一个分支的一个分支的一个分支的一个分支的一个分支上分支出来。

    对于您的具体问题,git 没有分支可见性的概念。如果我克隆你的仓库,我得到所有的分支就好了,而 你的本地仓库如何跟踪远程分支并不重要。

    简而言之,如果您不希望人们拥有可用于 repo 的信息,请不要让他们克隆它。提供仅包含您需要的信息的不同远程存储库,并仅将相关信息推送到那里。

    例如,我的仓库有分支 public、private-1 和 private-2,我可以将我的所有分支推送到 origin(git push private-remote private-1 等),并进行另一个远程设置将public 推送给它。

    然后您的学生克隆公共远程,从public 分支,推送他们的更改和他们自己的分支,然后您可以从public-remote 拉出这些分支并推送到您的private-remote。 Git 支持多个遥控器就好了。

    【讨论】:

    • 理想情况下,学生会将他们的更改推送到他们自己的个人存储库中。我可以看到所有学生共有的public-remote 在超过 5 个学生推送后会变得非常混乱。学生故意把事情搞砸也太容易了。如果您在学校网络上,您可能已经为每个用户拥有某种公用文件夹,这通常是您让学生发布他们的存储库的地方。然后老师可以git fetch /pub/student_id/course_42 homework_1:student_id_hw_1,这很容易编写脚本。您不必授予写入权限。
    • @Gauthier 在这种情况下,PR 系统工作得非常好。所有学生都从原始库中分叉,克隆,随意推送,然后向老师提交拉取请求,要求他们合并他们的更改。
    • @MadaraUchiha 没错,这就是我会使用的工作流程,但不一定需要额外的系统来分叉和发送请求。我只是告诉学生如何命名他们的分支(例如homework_1),并在截止日期之前将其推送到特定可访问位置(例如/pub/<login>/<course_name>)的公共克隆中。如果他们不能做到这一点,他们可能无论如何都不会成为优秀的编码员:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多