如果我修改Git预提交钩子中的日期戳文件,并简单地调用";git add timeStamp.cs“;?

如果我修改Git预提交钩子中的日期戳文件,并简单地调用";git add timeStamp.cs“;?,git,pre-commit-hook,Git,Pre Commit Hook,这个论坛上有几个帖子在某种程度上触及了这个主题,但作为Git的初学者,我不理解它们,也无法让它们正常工作。我有一个C#项目,我想在提交日期和时间中链接到使用Git预提交挂钩。当我尝试以下方法时,似乎效果不错: cmd.exe /c "getTimeStampAndUpdateTimeStampFile.exe" git add timeStamp.cs 然而,我在搜索互联网时发现的大多数代码片段要复杂得多,通常需要隐藏,但我不明白为什么需要它。有人能简单地解释一下我的简单方法的缺点是什么,什么

这个论坛上有几个帖子在某种程度上触及了这个主题,但作为Git的初学者,我不理解它们,也无法让它们正常工作。我有一个C#项目,我想在提交日期和时间中链接到使用Git预提交挂钩。当我尝试以下方法时,似乎效果不错:

cmd.exe /c "getTimeStampAndUpdateTimeStampFile.exe"
git add timeStamp.cs
然而,我在搜索互联网时发现的大多数代码片段要复杂得多,通常需要隐藏,但我不明白为什么需要它。有人能简单地解释一下我的简单方法的缺点是什么,什么时候会给我带来问题吗?

因为,其他方法可能更好,但要回答这个问题:

我会遇到什么麻烦

我们需要了解,Git不是从工作树(您可以查看和处理文件的地方)中构建提交,而是从索引中构建提交

TL;这里要说明的是,一些
git提交
选项会导致使用机密的附加索引文件,因此您的
git添加
可能会影响一次提交,但不会影响后续提交

长的 该索引也称为暂存区或(现在很少称为)缓存,它实际上只是
.git
目录中名为
index
的文件中的一个数据结构。也就是说,
git commit
通常会打开并读取
.git/index
,以查看在新提交中放入什么内容。2

问题是,您可以和Git在内部将自己从索引重定向到其他索引。您可以通过将环境变量
Git\u INDEX\u FILE
设置为保存一些文件名来实现这一点,或者Git自己实现这一点。这会影响每个
git子命令
命令,包括
git add
,因此
git add
会将文件复制到替代索引而不是主索引中

运行常规的、普通的
git提交时,git:

  • 使用常规索引(因此
    GIT_index_文件
    未设置,或设置为name
    .GIT/index
  • 运行预提交钩子,如果拒绝提交,则提前退出
  • 锁定索引以防更改(在我们读取索引时,不会添加任何
    git
    s!)
  • 使用索引中的任何内容构建实际提交,将新提交哈希ID写入或通过
    ;及
  • 解锁索引
但是您也可以运行
git-commit——仅运行
或默认的
git-commit——包括带有文件名的
,和/或使用
git-commit-a
。这些操作的效果是,从“预先添加”了文件的索引中进行新提交。为了实现这一点,Git构建了一个替代的临时索引。也就是说,此工作树的主索引(无论它位于哪个文件中)尚未修改。它仍然匹配在您启动这个特定的
git commit
命令之前的内容。备选索引由以下人员填写:

  • HEAD
    commit如果使用了
    git commit--only
    :我们想要一个类似于
    HEAD
    但有一些更新的commit,或者
  • 如果使用了
    git commit--include
    ,则当前索引:我们希望提交相当于
    git add
    ing一些文件,但是如果新提交由于某种原因失败,我们不希望将文件添加到(主)索引中
如果您使用了
git commit-a
,git现在运行内部等价的
git add-u
来更新这个临时索引,就像
git add-u
更新任何索引一样。如果您指定了特定的文件,Git现在会在每个文件上运行与Git add相当的
Git。无论哪种方式,现在都会更新此临时索引以保存建议的新提交

现在,我们有了一个替代的临时索引,用于保存新提交中应该包含的内容。如果这个新提交成功,Git还需要更新实索引,因此Git可能也需要构建更新的实索引

此时,有两个或三个索引文件:

  • 主/真实索引
  • 我们的临时索引
  • 预计的新主要指数
  • 如果我们的临时文件是投影的新文件,也就是说,我们使用了
    git commit--include
    而不是
    git commit--only
    ,那么临时文件和投影的主文件是同一个文件:文件2和3都只是命名为
    .git/index.lock
    (或者是添加的工作树的不同路径)

    Git现在像往常一样运行预提交钩子,但是
    Git_INDEX_FILE
    被设置为指向FILE#2,即在此
    Git提交期间使用的临时索引。如果您的钩子使用了git add
    ,它会将这些文件添加到文件2中

    如果提交失败,Git只会回滚所有内容:(主)索引保持不变。在钩子中运行的
    git add
    已有效撤消

    不过,如果提交成功,Git现在会将索引文件#3重命名为主索引,即准备好的、更新过的索引。除非文件2和文件3是同一个文件,否则对文件2执行的
    git add
    将消失。这并不一定有害,用户可以再次运行
    git add
    ,但这确实很奇怪


    1之所以使用这个词,主要有多种原因,但总体思路是:有一些文件,出于各种目的,您可以或Git有时使用不同的文件

    2如果您在添加的工作树中,(主/默认)索引位于
    .git
    目录下的不同位置。每个工作树都有自己的私有默认索引。

    同样,其他替代方法可能更好,但要回答这个问题:

    我会遇到什么麻烦

    我们需要了解Git并不是从