Git记录不同的行为



我的笔记本电脑和gitlab CI之间有一个奇怪的行为。当我在笔记本电脑上执行以下命令git log -1 --date=short index.html时,它会显示文件的最后一次提交。

git log -1 --date=short index.html
commit 5df9780d5431fd8efe6ba968ea74090a0189a228
Author: test <jenkins@test.com>
Date:   2021-03-31
Commit for index.html

而当我在执行管道时在.gitlab-ci.yml中执行命令时,我有整个repo的最后一次提交,而不仅仅是index.html文件。

git log -1 --date=short index.html
commit 55b13a77fb7e081dc4531e040f3c2c227c0e6412
Author: test <jenkins@test.com>
Date:   2021-09-07
Commit for README.md

有人可以帮助我理解为什么?我尝试显示许多不同的选项,但除了显示文件的git日志历史记录外,这两台机器似乎相似。为了完成,我只在主分支上工作,没有创建其他分支。

这是两件事的结合:

  • git log,请求文件历史记录,从实际存在的唯一历史记录中伪造:存储库中的提交
  • GitLab CI被要求克隆存储库,通常(出于充分的原因)使用克隆,这意味着更少的提交=更少的历史记录

特别是,您运行的命令-git log -1 --date=short index.html-告诉git log:

  • 从当前或HEAD开始提交。将此提交放入待访问队列。

  • 现在,对于队列中的每个提交(在循环中,按照优先级顺序从队列中删除提交,以便在它们之上循环——但最初只有一个提交):

    • 检查提交。加载其已保存的源树,以及前一个或父级提交的已保存源树。(合并提交是指具有两个或多个父级的提交。)如果没有前一次提交,例如,这是第一次提交,则加载一个";空树";保存的父树。

    • 如果在比较提交中保存的文件index.html(或伪空树)中保存的index.html时,此文件中存在一些差异,则将此提交标记为";要打印出来";。这种差异可能是文件的更改(如果它在两个保存的快照中),也可能是其存在性的更改(例如,在本次提交中,在父级中消失)。

    • 将父级或父级放入队列中。

    • 如果要打印此提交,请使用--date=short打印,然后退出(-1)。

循环到此结束。因此,我们打印以某种方式更改一个指定文件的第一个提交,例如,最初创建它(它不在父文件中)或修改它(它在两个提交中,但在两个快照中不同)。

这里的合并提交很棘手,通常不会被这个过程打印出来(您可以使用额外的git log标志来修改这种行为)。然而,它们确实将多个父级推入队列,这使得优先级队列方面很重要。但合并提交可能只是转移注意力。相反,让我们多谈谈浅克隆

要进行浅层克隆,Git客户端(clone操作作为客户端运行)会要求服务器在某个时间点后停止发送提交。也就是说,服务器说,例如,最近的提交是badc0ffee,所以客户端说给我提交。然后服务器说badc0ffee之前的提交是deadcafe,但客户端说:哦,我只想要一个提交,毕竟不要给我deadcafe

因此,服务器不会。请记住,虽然提交badc0ffee有一些父deadcafe,但客户端将散列IDdeadcafe存储在浅移植物数据库中。当客户端遇到提交deadcafe的引用时,它会假装提交不存在,并且没有这样的引用。

结果是,在制作此提交浅层克隆的客户端上运行的git log -1认为浅层克隆中的一个提交有史以来唯一的提交。文件index.html存在于最后一次提交中,因为没有父级——浅层有效地消除了父级——它是在该提交中创建的。因此,它与空树不同,git log -1将打印出上次提交的哈希ID和元数据。

如果我们制作一个深度为两次提交的浅层克隆,我们将同时拥有badc0ffeedeadcafe,但deadcafe的父级(假设它是cabbabb1e)将被切断。如果我们在这里运行git log -1 index.html,Git将首先比较badc0ffee中的index.htmldeadcafe中的index.html。如果不同git log将打印提交badc0ffee(然后由于-1而退出)。如果没有,Git将继续提交deadcafe。由于其父cabbabb1e通过浅克隆被切断,git log将相信提交deadcafe创建了index.html,并将打印出提交的(然后退出)。

结论

你需要知道什么是浅层克隆,何时使用,以及何时使用。你可能需要让你的GitLab设置产生一个不那么浅或根本不浅的克隆,才能在这里获得你想要的任何效果。

最新更新