【问题标题】:Add pre commit hook to submodule from parent module's .git从父模块的 .git 向子模块添加预提交钩子
【发布时间】:2021-12-07 14:41:23
【问题描述】:

所以我有一个带有子模块的项目,它每隔一段时间就会更新一次。我有一些我尝试遵循的提交规则,其中之一是在提交中包含分支名称。我使用 githooks 完成此操作,如下所示:

从顶级目录

.git/hooks/prepare-commit-msg

#!/bin/sh

BRANCH=`git branch | grep '^\*' | cut -b3-`
FILE=`cat "$1"`
echo "$BRANCH $FILE" > "$1"

.git/hooks/pre-commit

#!/bin/bash

find vendor -name ".git*" -type d | while read i
do
        if [ -d "$i" ]; then
                DIR=`dirname $i`
                rm -fR $i
                git rm -r --cached $DIR > /dev/null 2>&1
                git add $DIR > /dev/null 2>&1
        fi
done

然后我只是设置权限 sudo chmod 755 .git/hooks/prepare-commit-msg sudo chmod 755 .git/hooks/pre-commit

但是,这不适用于子模块,因为它没有 .git 目录。有没有办法强制子模块使用父目录中的钩子?如果我独立打开子模块,我可以让它工作,但是将它放在父模块下会更实用,因为它可以让东西井井有条。

【问题讨论】:

  • 1. stackoverflow.com/a/67848922/7976758 2. 子模块有.git 目录;但是您必须了解子模块是独立的存储库并具有独立的挂钩。
  • 不适用于我所在的仓库:来自partent repo cd submodule ls -lah .rw-r--r-- 28 uname 7 Oct DATE .git 如果我单独克隆子模块,我可以编辑它(正如我在问题中提到的)
  • 我完全愿意将钩子添加到子模块,但是当它附加到父模块并由 git submodule update --init 创建时我不能这样做,因为子模块没有有一个 .git 目录,只是一个文件。当 submod 独立时:drwxrwxr-x - user 20 Oct DATE .git 当 submod 附加到 parent 并由 git submodule update 创建时:.rw-r--r-- 28 uname 7 Oct DATE .git
  • 读取.git 文件:它包含子模块存储库的路径。看那里:它是一个存储库,有一个hooks 目录。你可以把 Git 钩子放在这里。不过这一切都很痛苦。如果您想走这条路,使用git rev-parse --git-directory 将帮助您自动执行此操作。

标签: git git-submodules githooks


【解决方案1】:

使用子模块,您可以拥有一个单独的 Git 目录,也可以拥有一个吸收的子模块。现在 Git 代码更喜欢后者,当使用它时,子模块中的 .git 是一个称为 gitlink 的特殊文件,它指向主存储库的 @987654322 中的一个目录@目录。

如果你想找到任何 Git 存储库的 hooks 目录,无论是否是子模块,你可以运行这个命令:

$ git rev-parse --git-path hooks

这将打印 hooks 目录。如果您想在子模块中使用与父模块相同的钩子,您可以将子模块的钩子目录设为父模块的符号链接。

【讨论】:

  • 这是对我有用的答案。我不得不:vim .git/modules/submodule/hooks/prepare-commit-msgvim .git/modules/submodule/hooks/pre-commit。谢谢。
猜你喜欢
  • 2012-06-06
  • 2012-11-04
  • 1970-01-01
  • 2014-08-31
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2013-12-15
相关资源
最近更新 更多