Git从浅层克隆中找到<ref>以来的修改过的文件

时间:2017-05-04 22:44:35

标签: git git-diff git-remote git-fetch

我在运行测试的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 ,直到我的历史记录包含提交。这似乎很痛苦(意味着编写/维护很烦人)而且价格昂贵(意味着很慢,请记住浅层克隆的目的是降低这个成本)。

3 个答案:

答案 0 :(得分:2)

  

否则,似乎我可能必须编写循环并继续调用--deepen,直到我的历史记录包含提交。这看起来很痛苦......

是痛苦的(而且很慢,你稍后会注意到这一点)。

Modern Git(自版本2.11起)确实有一个新的git fetch选项:

  

- 浅 - 排除= LT;修改&GT;

     
    深化或缩短浅存储库的历史记录    排除从指定的远程分支或标记可到达的提交。    可以多次指定此选项。

我没试过这个;它不清楚它是否允许哈希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,还必须存储上次部署的日期,否则效果很好。