2012-01-19 81 views
17

我想克隆Linux內核回購,但只從版本3.0開始,因爲內核回購是如此之大,它使我的版本控制工具運行速度更快,如果我可以做一個淺層克隆。我的問題的核心是:我怎麼能告訴git的「n」值是--depth參數?我希望這會工作:git淺克隆到特定的標記

混帳克隆http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 3.0

感謝。

+0

另請參閱[如何從git存儲庫中刪除舊的歷史記錄?](http://stackoverflow.com/questions/4515580/how-do-i-remove-the-old-history-from-a- git-repository) – Alberto

回答

2

不幸的是,--depth參數git clone只接受一個數字,即克隆存儲庫應該截斷的修訂版本號。

一個可能的解決方案是克隆整個存儲庫,然後截斷其歷史記錄以保留v3.0之後的僅提交。這裏是一個很好的操作方法: http://bogdan.org.ua/2011/03/28/how-to-truncate-git-history-sample-script-included.html

git checkout --orphan temp v3.0 
git commit -m "Truncated history" 
git rebase --onto temp v3.0 master 
git branch -D temp 
git gc 
+0

這應該和我提供的解決方案一樣好,但我也建議刪除所有其他本地引用並運行我在解決方案中的清理步驟。沒有這一點,回購將仍然包含完整的歷史和額外的對象。這個回購大約有200萬件物品懸掛在需要的地方。 – James

+0

好注意事項,增加了 – tomgi

+0

這個策略需要管理衝突的合併,並且根據合併的處理方式產生不是最終主數據的確切副本的風險。由於回購是如此之大,所以您不太可能手工合併,因此您可以將'-Xours'或'-Xtheirs'選項添加到rebase命令。我相信你會發現最終結果與主裁判的來源不同。 – James

7

完全瞭解一個解決方案,但不幸的是,git的克隆不會在您所請求的方式工作。參數--depth的數量不限於commitsrevisions的數量。沒有限制提交數量的克隆參數。在你的情況下,即使你知道只有最多10個版本差異的文件在v3.0和最新的HEAD之間有所變化,並且使用了--depth 10,你仍然可以獲得大部分或整個回購歷史記錄。因爲有些對象可能沒有多達10個修訂版本,並且您將從它們首次出現在回購庫中的開始就獲得它們的歷史記錄。

現在這裏是怎麼做的,你喜歡什麼: 你的問題的關鍵是,你需要V3.0和最近你最想要的參考值之間的提交。下面是我做的步驟來做到這一點:

  • git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 10075 smaller_kernel_repo
  • cd smaller_kerenel_repo
  • 確定V3.0的SHA git log --oneline v3.0^..v3.0
  • 開始創建這個沙移植點(這是02f8c6aee8df3cdc935e9bdd4f2d020306035dbe)
  • echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
  • 解決一些內核日誌條目的問題:export GIT_AUTHOR_NAME="tmp"export GIT_COMMITTER_NAME="tmp"

  • 有一個很好的警告有關手冊頁約git filter-branch按照移植點改寫歷史......所以讓我們的濫用行爲,現在運行git filter-branch和守株待兔...(和等待,等待)

現在,你需要清理一切:

git reflog expire --expire=now --all 
git repack -ad # Remove dangling objects from packfiles 
git prune  # Remove dangling loose objects 

這個過程是費時,但不是很複雜。希望從長遠來看,它一直能爲你節省所有的時間。在這一點上,你將基本上是一個回購,修訂歷史從linux-stable.git回購只有v3.0起。就像在克隆上使用--depth一樣,您對repo具有相同的限制,並且只能修改和發送已有歷史記錄中的修補程序。有辦法解決..但它值得自己Q &答:

我正在測試出最後幾個步驟自己,但git filter-branch操作仍在繼續。我會在任何問題上更新這篇文章,但我會繼續併發布它,以便您可以在此過程中開始使用,前提是您認爲它可以接受。

更新問題

解決方法(致命:空的ident <>不允許的)。這個問題源於Linux repo提交歷史中的問題。

更改git filter-branch命令:

git filter-branch --commit-filter ' 
    if [ "$GIT_AUTHOR_EMAIL" = "" ]; 
    then 
      GIT_AUTHOR_EMAIL="[email protected]"; 
      GIT_AUTHOR_NAME='tmp' 
      GIT_COMMITTER_NAME='Me' 
      GIT_COMMITTER_EMAIL='[email protected]' 
      git commit-tree "[email protected]"; 
    else 
      git commit-tree "[email protected]"; 
    fi ' 
+1

我認爲在這裏嚴格區分* revision *和* commit *是過於複雜的事情。雖然我知道[形式差異](http://stackoverflow.com/a/11792712/1127485),在'git clone --depth '的上下文中,修訂的數量等於來自提示。 – sschuberth

0

--depth參數似乎是唯一的數(即「指定的修訂版數」),而不是一個標籤。

可能的想法(待測試):

你可以使用git describe但爲了得到你目前的HEAD最新的標籤,以及承諾之間的數量所述標籤和HEAD
如果「最近的標籤」不是您的標籤,只需重複該過程,從最新標籤引用的提交開始,直到您找到您的標籤(例如v3.0)。

如果您的標籤可從當前的HEAD訪問,那麼所有這些提交編號的總和將會給予您深入的git clone命令。

17

如何將標籤克隆到1的深度?

  • git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git
+0

這不是**接受的答案? – tftd

1

有人誰已經擁有了克隆此命令將獲得當前分支的末端和標籤5.6之間提交的數目:

$ git rev-list HEAD ^5.6 --count 
407 

我發現這個項目實施使用GitHub API的rev-list: https://github.com/cjlarose/github-rev-list

rev-list上非常冗長的手冊頁表明幕後有很多事情要做。有許多不同的路徑可能會通過分支和合並進行計數提交。 (?)對於這種使用情況雖然這大概可以忽略不計

0

爲了使@ n8henrie回答更完整一點,你可以添加--single-branch選項,如:

git clone --single-branch --branch mytag0.1 --depth 1 https://example.com/my/repo.git 

在這你只能得到與這個特定標籤相關的存儲庫對象,在我的經驗中,在許多情況下,它佔用了相當多的空間。從git-clone docs

- [無糖]單分支

克隆僅歷史導致單個分支的前端,或者由--branch選項或主支路遠程的HEAD點指定在。進一步提取到生成的存儲庫中將只會更新分支的遠程跟蹤分支,此選項用於初始克隆。如果在製作--single-branch克隆時遠程的HEAD未指向任何分支,則不會創建遠程跟蹤分支。

額外的注意事項:如果你從另一個文件夾在同一臺計算機上克隆一個本地回購,有必要使用file://協議提及,而不是僅指定文件夾名稱,以它。