我在运行测试的CI盒子上。为了加快速度,我只是做一个浅层克隆:
git clone --depth 1 git@github.com:JoshCheek/some_repo.git
假设所有测试都通过,我想触发管道中的下一步。触发的内容取决于最后 d 部署(ref d123456
)和 c urrent ref之间哪些文件发生了变化我参与测试(参考{{1} })。如果我做了一个正常的克隆,我可以发现这样:
c123456
但我的克隆很浅,所以它不知道那些提交。我看到我可以使用git diff --name-only d123456 c123456
来获取更多的历史记录,但我只知道SHA,而不是SHA的深度。以下是一组可以回答这个问题的方法:
git fetch --depth=n
否则,似乎我可能必须编写循环并继续调用# 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
,直到我的历史记录包含提交。这似乎很痛苦(意味着编写/维护很烦人)而且价格昂贵(意味着很慢,请记住浅层克隆的目的是降低这个成本)。
答案 0 :(得分:2)
否则,似乎我可能必须编写循环并继续调用
--deepen
,直到我的历史记录包含提交。这看起来很痛苦......
是痛苦的(而且很慢,你稍后会注意到这一点)。
Modern Git(自版本2.11起)确实有一个新的git fetch
选项:
- 浅 - 排除= LT;修改>
深化或缩短浅存储库的历史记录 排除从指定的远程分支或标记可到达的提交。 可以多次指定此选项。
我没试过这个;它不清楚它是否允许哈希ID(测试使用名称),并且在任何情况下,您都要指定要加深的提交的父级,而不是提交你想获取。但这可能就足够了。
(我真的认为更好的方法是保留你可以借用的参考克隆。)
答案 1 :(得分:1)
除了浅克隆之外,还有几种可能的解决方案可以减少克隆时间和空间。
1。git clone <url> -b <branch> --single-branch
这仅获取<branch>
可到达的数据。不如--depth=1
有效,但仍然比完整克隆更好。当repo有许多不同的分支时,它工作正常。
2。git init;git fetch <url> <tag>
类似地,它只获取<tag>
可以访问的数据。
3.创建并使用镜像回购。
git clone <url> --mirror -- /foo/mirror
。 /foo/mirror
是镜像回购。假设您的CI系统同时启动多个实例。通过git clone <url> --reference=/foo/mirror -- <instanceN>
克隆每个。在每个克隆中,只有从镜像仓库中找不到的数据才会从远程仓库下载。您可以删除实例以在作业完成时保存空间。但是,请根据远程仓库的更新频率定期保留并更新git fetch
的镜像仓库。例如,在午夜一天,或在周日每周一次。
4.使用git worktree
。
制作克隆,保留并在每个CI实例启动时首先更新它。使用git worktree
将修订签出到每个实例的不同工作树中。
答案 2 :(得分:0)
我遇到了同样的问题并使用了
git clone --shallow-since=<date>
我不仅必须存储上次部署的SHA,还必须存储上次部署的日期,否则效果很好。