在超级项目中自动提交git子模块哈希

时间:2012-01-06 18:19:02

标签: git version-control

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

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

我想做的是:

  1. 提交子模块中的更改
  2. 在超级项目中自动提交哈希
  3. 将子模块和超级项目推送到远程源('git push')
  4. 最好的方法是弄清楚你是在一个子模块,超级项目是什么等,并自动化这个?

    可能在子模块中有某种后提交挂钩?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分: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"