Jos*_*eek 6 git git-diff git-fetch git-remote
我在 CI 盒子上运行测试。为了加快速度,我只是做了一个浅克隆:
git clone --depth 1 git@github.com:JoshCheek/some_repo.git
Run Code Online (Sandbox Code Playgroud)
假设所有测试都通过,我想触发管道中的下一步。触发的内容取决于上次部署(参考d123456)和我刚刚测试的当前参考(参考c123456)之间更改的文件。如果我做了一个普通的克隆,我可以发现这样的结果:
git diff --name-only d123456 c123456
Run Code Online (Sandbox Code Playgroud)
但我的克隆很浅,所以它不知道这些提交。我发现我可以用来git fetch --depth=n获取更多历史记录,但我只知道 SHA,而不知道 SHA 的深度。以下是可能可以回答这个问题的一组方法:
# hypothetical remote diff
git diff --name-only origin/d123456 origin/c123456
# hypothetical ref based fetch
git fetch --shallow-through d123456
git diff --name-only d123456 c123456
# hypothetical way to find the depth I need
depth=`git remote depth-to d123456`
git fetch --depth "$depth"
git diff --name-only d123456 c123456
Run Code Online (Sandbox Code Playgroud)
否则,我似乎可能必须编写一个循环并继续调用,--deepen直到我的历史记录包含提交。这看起来很痛苦(意味着编写/维护很烦人)并且昂贵(意味着缓慢,请记住浅层克隆的目的是减少这种成本)。
否则,我似乎可能必须编写一个循环并继续调用,
--deepen直到我的历史记录包含提交。好像很痛苦的样子...
这是痛苦的(而且很慢,正如你稍后会注意到的那样)。
现代 Git(自 2.11 版起)确实有一个新git fetch选项:
--shallow-exclude=<修订版>
加深或缩短浅存储库的历史记录,以排除可从指定远程分支或标记访问的提交。该选项可以指定多次。
我没有尝试过这个;目前尚不清楚它是否允许哈希 ID(测试使用名称),并且在任何情况下,您都将指定您想要深入的提交的父级,而不是您想要获取的提交。但这可能就足够了。
(我真的认为更好的方法是保留可以借用的参考克隆。)