我想克隆Linux內核回購,但只從版本3.0開始,因爲內核回購是如此之大,它使我的版本控制工具運行速度更快,如果我可以做一個淺層克隆。我的問題的核心是:我怎麼能告訴git的「n」值是--depth參數?我希望這會工作:git淺克隆到特定的標記
混帳克隆http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 3.0
感謝。
我想克隆Linux內核回購,但只從版本3.0開始,因爲內核回購是如此之大,它使我的版本控制工具運行速度更快,如果我可以做一個淺層克隆。我的問題的核心是:我怎麼能告訴git的「n」值是--depth參數?我希望這會工作:git淺克隆到特定的標記
混帳克隆http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 3.0
感謝。
不幸的是,--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
完全瞭解一個解決方案,但不幸的是,git的克隆不會在您所請求的方式工作。參數--depth
的數量不限於commits
的revisions
的數量。沒有限制提交數量的克隆參數。在你的情況下,即使你知道只有最多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
git log --oneline v3.0^..v3.0
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 '
我認爲在這裏嚴格區分* revision *和* commit *是過於複雜的事情。雖然我知道[形式差異](http://stackoverflow.com/a/11792712/1127485),在'git clone --depth
的--depth
參數似乎是唯一的數(即「指定的修訂版數」),而不是一個標籤。
可能的想法(待測試):
你可以使用git describe
但爲了得到你目前的HEAD最新的標籤,以及承諾之間的數量所述標籤和HEAD
。
如果「最近的標籤」不是您的標籤,只需重複該過程,從最新標籤引用的提交開始,直到您找到您的標籤(例如v3.0
)。
如果您的標籤可從當前的HEAD
訪問,那麼所有這些提交編號的總和將會給予您深入的git clone
命令。
如何將標籤克隆到1的深度?
git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git
這不是**接受的答案? – tftd
有人誰已經擁有了克隆此命令將獲得當前分支的末端和標籤5.6
之間提交的數目:
$ git rev-list HEAD ^5.6 --count
407
我發現這個項目實施使用GitHub API的rev-list: https://github.com/cjlarose/github-rev-list
rev-list上非常冗長的手冊頁表明幕後有很多事情要做。有許多不同的路徑可能會通過分支和合並進行計數提交。 (?)對於這種使用情況雖然這大概可以忽略不計
爲了使@ 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://
協議提及,而不是僅指定文件夾名稱,以它。
另請參閱[如何從git存儲庫中刪除舊的歷史記錄?](http://stackoverflow.com/questions/4515580/how-do-i-remove-the-old-history-from-a- git-repository) – Alberto