2017-05-04 157 views
0

我在运行测试一个CI方框,因为 修改的文件。为了加速这一过程,我只是在做一浅克隆: 的Git找到一个浅克隆

git clone --depth 1 [email protected]:JoshCheek/some_repo.git 

假设所有的测试都通过了,我想触发在管道中的下一个步骤。触发什么是基于哪些文件在最近的部署(参考d123456)和我刚测试的urrent ref之间发生变化(参考文献c123456)。如果我已经做了一个正常的克隆,我可以发现这样的:

git diff --name-only d123456 c123456 

但是我的克隆很浅,所以它不知道那些提交。我发现我可以使用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 

否则好像我可能会写一个循环,并保持调用--deepen直到我的历史包含了承诺。这看起来很痛苦(意味着写/维护令人讨厌)和昂贵(意味着缓慢,记住浅克隆的目的是为了降低这个成本)。

回答

2

否则,似乎我可能必须编写一个循环,并保持调用--deepen,直到我的历史包含提交。这似乎是痛苦的......

痛苦(而缓慢,因为你以后注意一点)。

现代的Git(自2.11版本),并有一个新的选择git fetch

--shallow - 排除= <修订>

    深化或缩短浅库的历史,以 排除提交从指定的远程分支或标签可到达。 该选项可以指定多次。

我没有尝试这样做;目前还不清楚,如果它允许一个散列ID(测试使用的名称),并在任何情况下,你会指定父(S)的的承诺要深化通过,而不是承诺要获得。但它可能就足够了。

(我真的觉得一个更好的方法是保持基准克隆可以借用-从。)

+0

哦,很好,我完全错过了!可悲的是,似乎Github不支持它,当我尝试它说'致命的:服务器不支持 - 浅 - 排除':( –

+0

你可以进入最后一个笔记的更多细节?它不是我清楚什么参考克隆是(你是说一个完全克隆的回购缓存在CI服务器上?) –

+0

是的:有了参考克隆,你运行'git clone --reference [options] ',Git调用另一个Git在URL像往常一样,但后来借用或复印件(请参阅'--dissociate')从参考克隆的对象,而不是整个网络。测量上一个真正的项目复制它们,我修剪克隆挂钟时间从近两年(这涉及到一些相当大的仓库) – torek

1

有几种可能的解决方案,以降低克隆的时间和空间,除了浅克隆。

1. git clone <url> -b <branch> --single-branch

这仅取出由<branch>到达的数据。不如--depth=1有效,但仍比完整克隆好。当回购有多个分支分支时,它工作正常。

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为每个实例的不同工作树检出修订。

+0

谢谢你的想法!你好与缓存克隆密切合作。如果其状态不稳定,可能需要使用其他人的一些想法,但我现在很有希望。 –