【问题标题】:Git hooks - update file md5sum automatically upon commitGit hooks - 提交时自动更新文件 md5sum
【发布时间】:2014-02-20 19:00:08
【问题描述】:

我的 git 存储库中的一个脚本分发给许多用户。当他们运行此脚本时,我希望它查看我的存储库并查看是否对此脚本进行了任何更改,如果是,建议用户从存储库更新脚本。用户对git一无所知,希望在系统实现上尽量少了解。

我想在每次提交时自动更新此脚本的 md5sum,而无需手动操作。这是我写的预提交钩子

#!/bin/sh

echo -n "# "  > test.txt.tmp
linesNumber=`wc -l test.txt | awk '{print $1}'`
tail -n $(($linesNumber - 1)) test.txt | md5sum | awk '{print $1}' >> test.txt.tmp
tail -n $(($linesNumber - 1)) test.txt >> test.txt.tmp
mv test.txt.tmp test.txt
#git push
#git commit --no-verify --message "update file md5sum"

md5sum 工作正常,问题是提交后我的脚本再次显示为已修改。我试图在不运行预提交挂钩(--no-verify)的情况下提交我的更改,但 git 说我无法提交,因为我的分支在 'origin/master' 之前 1 次提交,我试图在之前推送我的更改提交 md5sum 但它从未完成操作。

实现此类功能的正确方法是什么?

【问题讨论】:

    标签: git githooks pre-commit-hook


    【解决方案1】:

    您的预提交挂钩不会 git add 更新后的 test.txt 文件。

    请注意,工作目录中文件的版本不一定是要提交的版本:

    echo foo > test.txt
    git add test.txt
    echo bar > test.txt
    git commit -m 'this commit has "foo" in test.txt'
    

    要在 pre-commit 钩子中查看索引中文件的版本——即,如果 pre-commit 钩子允许提交继续进行,而不执行任何 git add 步骤,将提交什么——你可以使用git show :0:test.txt。神奇的:0: 前缀是gitrevisions 语法,表示“为提交准备的版本”。 (您可以将其进一步缩写为 :test.txt,尽管我发现 :0: 作为 revspec 更明显一些;例如,我见过真正命名为 :README 的真实文件。:-))请注意,这绕过了任何涂抹过滤器。

    (想要测试整个当前索引内容,但也保留工作目录状态的 Hooks 可以使用 git stash save --keep-index。请参阅 How do I properly git stash/pop in pre-commit hooks to get a clean working tree for tests 获取建议和注意事项。)

    在我当前版本的 git (1.8.5.4) 中,如果我在预提交挂钩中修改文件并 git add 结果,我 added 的内容就是提交的内容。 (我确实对早期版本的 git 在 pre-commit 钩子运行之前保存索引有一些模糊的回忆,因此对索引所做的更改不会使其进入提交,但我可能只是记错了。)

    旁白:在预提交挂钩中修改提交内容通常不是一个好主意。它们实际上只是为了验证提交已准备就绪。但如果你下定决心要修改内容,git add(或git update-index,但 add 更简单)就可以了。

    【讨论】:

    • 我将 git 版本更新为 1.9,并在 git commit 命令之前添加了 git add test.txt。现在我收到此错误消息“错误:Ref refs/heads/master is at 710174cafabb7baf34ddeae21f16df178816cefe but expected ee25c68f58161015f9654559a155da2851a059bd”
    • 有趣。现在有git commit inside pre-commit 钩子吗?这可能会混淆后面的git commit,这将在预提交挂钩退出时发生。
    • 但是我使用git commit --no-verify,不应该调用预提交钩子。也许完全不同的想法?假设您想在每次提交对某个文件的更改时在某个文件中添加某种标识符,您会怎么做?
    • 是的,--no-verify inner 提交(由你的钩子运行)跳过了钩子。然后 outer 提交(运行你的钩子的那个)去进行一个新的提交,但是“嘿等一下,在我调用 pre-commit 钩子之前,我有 refs/heads/master 设置了这个方式,现在不一样了!”对我来说,如果我这样做,我只会制作钩子 check 文件是否具有所需的值,而不是尝试放入 new 值。然后我可能会在运行 git commit 之前使用 git 别名(例如,git ci 别名来运行脚本)更新文件。
    猜你喜欢
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多