【问题标题】:Why does git's pre-commit hook verify that HEAD exists?为什么 git 的 pre-commit hook 会验证 HEAD 是否存在?
【发布时间】:2016-06-13 09:29:55
【问题描述】:

在它的预提交钩子中,git 似乎验证了 HEAD 的存在。如果不是,则默认为空树的特殊哈希来比较索引。

if git rev-parse --verify HEAD >/dev/null 2>&1
then
        against=HEAD
else
        # Initial commit: diff against an empty tree object
        against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

它默认的哈希是一个特殊的哈希。我读到我也可以通过

git hash-object -t tree < /dev/null

against后面是这样使用的

# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --

为什么钩子会这样做?在什么情况下我可以提交但 HEAD 无效?

【问题讨论】:

    标签: git githooks pre-commit-hook


    【解决方案1】:

    HEAD 总是指向当前提交,因为:

    • 它包含当前分支的名称(例如ref: refs/heads/master),或者
    • 它直接指向实际的提交 ID(一个“分离的 HEAD”),因此它包含一个原始的 SHA-1 哈希字符串。

    如果HEAD 包含一个原始哈希值,那么HEAD 肯定是有效的,因为它必须指向一个真正的提交。但是...在一个全新的空存储库中会发生什么?

    你在分支master,所以HEAD 读作ref: refs/heads/master。但是分支master 的尖端是什么? master 本身存储了什么提交 ID?

    存储库中没有提交。 master 点在哪里?

    Git 解决这个问题的方法是保持master 无效。那是git rev-parse --verify HEAD 失败的时候:HEADmaster,但master 还不存在。

    在内部,Git 将此称为“未出生的分支”,有时也称为“孤儿分支”。使用git checkout --orphan newbranch 会将Git 置于与新创建的(除了它还没有真正创建)分支newbranch 相同的状态。 HEAD 引用现在包含 ref: refs/heads/newbranch,但仍然没有 newbranch。所以每个未出生的分支状态都是这样的,但每次创建一个新的空存储库时都会看到一个特定的状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 2023-04-11
      • 2015-09-02
      • 1970-01-01
      • 2018-07-28
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多