2017-05-04 119 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

謝謝你的想法!你好與緩存克隆密切合作。如果其狀態不穩定,可能需要使用其他人的一些想法,但我現在很有希望。 –