2012-09-19 80 views
5

在我的本地文件系統上,我希望能夠克隆git repo(A)的頭部,所以沒有歷史記錄到新的git repo(B)。但我想要B中的文件的硬鏈接的好處,以節省空間。有沒有辦法做到這一點?一旦回購A發生變化,硬鏈接甚至會有幫助嗎?本地淺git克隆與硬鏈接

謝謝!

回答

6

看來,不可能用對象數據庫之間的硬鏈接進行本地淺克隆,至少從git 1.7.12開始。 git clone --depth 1 --single-branch明確警告--depth在本地克隆中被忽略,並且使用file://。所以你需要在硬鏈接和淺層克隆之間進行選擇。

即使存儲庫發生變化,硬鏈接也可以工作,至少一段時間,因爲git會將新對象添加到新文件中,並且永遠不會修改現有文件。但是,它偶爾會重新包裝對象數據庫以提高效率,而我不知道如何保留硬鏈接。

如果選擇淺層克隆,則可以使用git clone --single-branch --depth 1 file://old_repo_dir選項創建克隆。我覺得這很煩人,--depth 1意味着1項歷史,所以你不僅會得到最新的提交,還會得到它的父項(或父項,如果它是合併)。父節點從原始存儲庫獲取提交消息,但提交消息存在是因爲提交的實際內容包含整個樹的創建。

我更喜歡用一個提交消息來創建初始樹,並提交一個提交消息。這是通過首先在舊回購庫中創建一個沒有歷史記錄的新分支,然後將該分支拖入新的空回購庫中。我在一個巨大的回購庫上測試了這個數據庫,它有一個674k對象的664MB對象數據庫(Emacs bzr庫轉換爲git)。當新的回購收到拉,它有一個36MB的對象數據庫與3477對象 - 所以多餘的內容顯然是修剪。以下是具體步驟:

# at the old repo: 
git checkout --orphan tmp-snapshot 
git commit -m "Initial commit." 

# at the new repo location: 
git init 
git pull OLD_REPO_DIR tmp-snapshot:master 

# back at the old repo: 
git branch -D tmp-snapshot # no longer serves a purpose 

現在,新的回購協議的master分支包含與樹相同的舊回購的樹中的單個提交,沒有任何歷史。

+0

父母的分支會發生什麼? – Jeff

+0

什麼都沒有;如果你不需要它,你可以用'git branch -D'來擺脫它。該分支在父回購中不需要額外的空間,因爲它包含一個指向樹(顯然)已經存在於回購中的單個提交。 – user4815162342

+0

在當前的git版本中'--depth' [隱含](https://www.git-scm.com/docs/git-clone)'--single-branch'。 – sphakka

2

你可以克隆它,然後重新創建父母提交頭提交。考慮到你的原始回購的對象很可能會被封裝,無論如何,你會比你想要的更難鏈接。是的,硬鏈接會保持一段時間完好無損,但是一旦你開始做gc或者其他類似的東西,效果可能會消失。你也可以使用替代而不是硬鏈接。

查找文檔git commit-tree從樹中創建一個提交,我不能告訴你確切的語法。

+2

'git checkout --orphan'然後'git commit'從樹創建一個提交而不訴諸管道。 – user4815162342

+0

@ user4815162342,謝謝,不知道。 –