我的笔记本电脑和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和元数据。
如果我们制作一个深度为两次提交的浅层克隆,我们将同时拥有badc0ffee
和deadcafe
,但deadcafe
的父级(假设它是cabbabb1e
)将被切断。如果我们在这里运行git log -1 index.html
,Git将首先比较badc0ffee
中的index.html
和deadcafe
中的index.html
。如果不同,git log
将打印提交badc0ffee
(然后由于-1
而退出)。如果没有,Git将继续提交deadcafe
。由于其父cabbabb1e
通过浅克隆被切断,git log
将相信提交deadcafe
创建了index.html
,并将打印出提交的(然后退出)。
结论
你需要知道什么是浅层克隆,何时使用,以及何时不使用。你可能需要让你的GitLab设置产生一个不那么浅或根本不浅的克隆,才能在这里获得你想要的任何效果。