代码之家  ›  专栏  ›  技术社区  ›  Cascabel

高耦合git子模

  •  14
  • Cascabel  · 技术社区  · 15 年前

    我有一个项目需要分为两个存储库:一组公共模型和一个基于这些模型的模拟,以及附加的代码。最终可能会有多个使用同一组模型的仿真,因此将它们放在单独的存储库中是一个明确的要求。显而易见的解决方案是将通用模型作为仿真的子模块。

    非常 高度耦合。人们会非常频繁地在他们的公共模型中添加一些东西,然后立即在模拟中使用它。我想这会给模拟回购的整合过程带来很多麻烦。为了在模拟中合并来自许多开发人员的更改,集成人员必须在公共模型子模块中进行并行合并。另一方面,它也使它必须使用子模块-真正的模拟 需要 知道它应该使用哪个版本的通用模型。

    这个项目由相当多的人参与。大多数开发人员对git只有非常粗略的了解:他们经常添加文件、提交和从源代码提取,希望有一个dev和stable分支。积分器自然学到了很多东西,但是任何涉及子模块的东西对他来说肯定都是新的。额外的好处:我要休假一个月,所以我不能扑灭任何火灾。结果是,有很多动机来制定工作流程 真正地 很难搞砸,并尽量减少与以前工作流程的差异。

    编辑:我刚碰到 git slave

    2 回复  |  直到 14 年前
        1
  •  7
  •   Community CDub    8 年前

    子模块是一个很好的选择,以确保参考精确修订的不同组成部分。
    true nature of submodules

    但是,对于紧密耦合的模块,我会尽量避免:

    “我想这会给模拟回购的整合过程带来很多麻烦”。

    我看不到一个中央集成过程有效地工作:它应该只记录新的快速发展。
    要做到这一点,任何希望推送任何内容的用户都需要先拉,并在已经推送的任何新更改的基础上重新设置其更改。
    开发人员更倾向于解决任何冲突和/或询问他/她的同事他/她在重设基础期间必须处理的一些修改的来源。

    这(拉、再基、推)并不总是可能的,因为:

    • 涉及“高级”(不太基本的)Git操作(工作流与当前工作流不完全相同)
    • 所涉及的工作(考虑其他贡献者的发展)
    • 环境设置(最好是设置一个额外的环境,以便重新设置基础,这也是“不太基本的”

    但这仍然是我努力的方向。

    (... 但也许不是 就在之前
    再说一次,谁会 全部的

        2
  •  14
  •   Cascabel    15 年前

    给其他人一些注意事项!

    新秀们将要犯的最大错误是在完成子模块更新之后,在子模块中使用分离头进行提交。我要用钩子发出的强烈警告来反击。

    下一个最大的问题可能是,在执行需要更新子模块的签出操作之后,无法更新子模块。同样,钩子可以检查并发出警告。

    编辑:

    这是钩子的初稿。记住,这是一个急迫的工作,让我轻松!

    在母公司回购中:

    #!/bin/bash
    if git submodule status | grep '^+' > /dev/null; then
        echo "WARNING: common model submodule now out of sync. You probably want to run" 1>&2
        echo "         git submodule update, then make sure to check out an appropriate branch" 1>&2
        echo "         in the submodule." 1>&2
    fi
    

    对于post commit,如果有子模块更改,我们会警告用户,他们可能忘记在提交中包含这些更改。在这种高度耦合的情况下,这是一个非常好的猜测。用户不太可能修改模拟和通用模型 分别地

    #!/bin/bash
    if git submodule status | grep '^+' > /dev/null; then
        echo "WARNING: common model submodule has changes. If the commit you just made depends" 1>&2
        echo "         on those changes, you must run git add on the submodule, and then run" 1>&2
        echo "         git commit --amend to fix your commit." 1>&2
    fi
    

    在子模块中,一个签出后钩子,用于强烈警告分离的头部:

    #!/bin/bash
    
    get_ppid() {
        ps --no-headers -o ppid $1
    }
    
    # Check to see if this checkout is part of a submodule update
    # git submodule calls git checkout, which calls this script, so we need to
    # check the grandparent process.
    if ps --no-headers -o command $(get_ppid $(get_ppid $$)) | grep 'submodule update' &> /dev/null; then
        if ! git symbolic-ref HEAD &> /dev/null; then
            echo "WARNING: common model submodule entering detached HEAD state. If you don't know" 1>&2
            echo "         what this means, and you just ran 'git submodule update', you probably" 1>&2
            echo "         want to check out an appropriate branch in the submodule repository." 1>&2
            echo
            # escape the asterisk from SO's syntax highlighting (it sees C comments)
            branches=($(git for-each-ref --format='%(objectname) %(refname:short)' refs/heads/\* | grep ^$(git rev-parse HEAD) | cut -d\  -f2))
            case ${#branches} in
                0 )
                    ;;
                1 ) 
                    echo "Branch '${branches[0]}' is at HEAD"
                    ;;
                * )
                    echo "The following branches are at HEAD: ${branches[@]}"
                    ;;
            esac
        fi
        echo
    fi
    

    我还添加了一个pre-commit钩子来简单地中止使用分离头进行的提交(除非它是一个rebase)。我很害怕听到经典的“我所有的承诺都消失了”的惊慌失措的抱怨。你总是可以绕过它 --no-verify