【问题标题】:Auto-committing git submodule hash in super-project在超级项目中自动提交 git 子模块哈希
【发布时间】:2012-01-06 18:19:02
【问题描述】:

在 git 子模块中提交时,需要上到超级项目进行第二次提交,这是子模块的新哈希。

这非常烦人,很容易忘记,如果你不这样做,可能会导致各种问题。

我想做的是:

  1. 在我的子模块中提交更改
  2. 在超级项目中自动提交哈希
  3. 将子模块和超级项目都推送到它们的远程源('git push')

确定您是否在子模块中、超级项目在哪里等并自动执行此操作的最佳方法是什么?

也许子模块中有某种提交后挂钩?

【问题讨论】:

    标签: git version-control


    【解决方案1】:

    你试过git-slave吗?这正是它的设计目的。

    您也可以自己编写脚本。请注意,git 命令本身有两个选项可以提供很大帮助:--work-tree--git-dir。使用这些,您可以在不离开当前目录的情况下对任何 repo 进行操作。

    然后还有git submodule foreach --recursive git push

    【讨论】:

    • 奇怪,零赞? +1,至少。我不知道这些命令中的任何一个;)
    • 在我尝试操作超级项目时,命令行选项似乎不起作用。这可能是由于在子模块中处理 Git 环境的方式。
    【解决方案2】:

    虽然子模块可能未针对此用途进行优化,但拥有子模块的子模块可能是维持对多个独立项目的单点访问的解决方案。

    这已经满足了实施 monorepo 时出现的需求。在每次子模块更新时自动提交超级项目可以减轻采用这种设置时的主要管理步骤。

    我拼凑了一个 post-commit 钩子,它非常简单,可以在子模块中的每次提交时自动更新超级项目。

    #!/bin/bash
    #
    # Update a superproject when a commit is made to a submodule.
    # Intended for .git/**modules/{THE_SUBMODULE}/hooks/post-commit
    # where the double-star indicates variadic path elements.
    #
    # Depends on Git >= 2.13.
    
    # Clean the Git environment before crossing repository boundaries.
    # From https://stackoverflow.com/questions/36196548/cannot-trigger-post-commit-git-hook-on-git-submodule
    while read variable; do
        unset $variable
    done < <(env | grep "^GIT_" | sed 's/=.*//g')
    
    COMMIT_MSG="submodule update"
    GIT="git"
    SUPERPROJECT_WORKING_TREE=`git rev-parse --show-superproject-working-tree`
    echo "? Committing to $SUPERPROJECT_WORKING_TREE."
    cd $SUPERPROJECT_WORKING_TREE
    $GIT add .
    $GIT commit -m "$COMMIT_MSG"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 2019-07-20
      • 2014-11-04
      • 2018-06-21
      • 2015-08-16
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多