【问题标题】:Why is the index not updated after doing a git add in a pre-commit hook?为什么在预提交挂钩中执行 git add 后索引没有更新?
【发布时间】:2015-03-31 07:17:37
【问题描述】:

我有一个预提交钩子:

  • 检查我的版本文件是否需要更新
  • 修改所述文件
  • 对此文件执行 git add

这允许我将更新的版本文件添加到同一个提交中。 我唯一的问题是,在钩子运行后,工作树和 HEAD 用新版本文件更新,但索引没有。我需要手动暂存索引的版本文件以反映更改。

我将 git 更新到 2.3.4,但这并没有解决任何问题。

我有什么遗漏吗?

更新

版本文件的当前设置:

  • 每个模块都包含一个版本文件
  • 它们存储在这里:/module/<name of module>/version.txt
  • 它们包含手动输入的版本号(例如 1.5.2)和父提交哈希

【问题讨论】:

    标签: git pre-commit-hook


    【解决方案1】:

    最好使用content filter driver,更具体地说是clean filter

    (图片显示在“Customizing Git - Git Attributes”,来自“Pro Git book”)

    该过滤器(通过.gitattributes declaration 与版本文件关联)将在git diffgit commit 上自动运行,并且会:

    • 检测版本是否需要更改
    • 根据需要更新版本文件

    这样,常规提交最终会提交一个更新的版本文件。自动。

    【讨论】:

    • 我已经更新了我的问题。这可以通过内容过滤器驱动程序实现吗?在这里设置version.txt filter=versionupdate 正确吗?如何告诉 versionupdate 脚本只检查当前模块的文件?
    • @diesonne 我不熟悉您项目的结构,但脚本的想法是始终检测您需要的版本,以便替换版本中的正确值。 txt.
    • @diesonne 过滤器将应用于所有version.txt 文件(每个文件执行一次脚本),并且脚本需要能够检测到它在哪个version.txt 上运行才能获得正确的信息。
    • 如果我理解这一点,那么我需要每次手动更新version.txt 文件,以便过滤器拾取并修改它?
    • @diesonne 的想法是让脚本检测新版本并更新正确的文件(然后自动成为提交的一部分)。我不知道它是如何检测到新版本号或从哪里检测到的。这是特定于您的项目的。但是,如果您可以检测到该版本号,那么我的观点是可以通过干净的内容过滤器驱动程序自动提交 version.txt。
    【解决方案2】:

    我添加了一个 post-commit 挂钩,它将自动执行版本文件的git add(如果有的话)。如果有人对此问题有更好/更容易/更清洁的解决方案,请告诉我。

    对于那些感兴趣的人,这是提交后:

    for fn in `git diff-tree -r --name-only --no-commit-id develop`; do
        if [[ $fn == *"version.txt" ]];then #prevent infinite loops that will eventually fill up the entire harddrive
            echo "post-commit hook found a version file at $fn"
            git add $fn
        fi
    done
    

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 2016-04-02
      • 1970-01-01
      • 2012-01-25
      • 2021-08-07
      • 2011-08-25
      • 2015-09-10
      • 1970-01-01
      • 2017-05-03
      相关资源
      最近更新 更多