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