2014-06-12 60 views
0

是否可以在git中克隆倉庫而不保留所有修訂版本?克隆git倉庫而不保留本地版本

我的存儲庫很大(幾十GB)。我不想在工作副本中增加兩倍的存儲空間。我只想要這些文件並知道去哪裏推/拉更新。這甚至可能與混帳或我需要返回顛覆?

+1

「我的存儲庫是幾十GB」 - 我認爲這是問題所在。 Git被設計用於存儲*代碼*(或類似的),大概無論你存儲什麼東西都離代碼很近! –

+0

@OliCharlesworth這確實不是嚴格的代碼,但我們確實需要在版本控制下。 – jlconlin

+0

您可以使用參考存儲庫或較低級別的版本'objects/info/alternates'來爲每個站點保留一箇舊歷史副本(一個站點是共享至少一臺可靠的通用文件系統的機器)。使裸倉庫獲取不會更改的舊標籤,將'--reference path/to/that/repo'添加到不需要快速訪問的未來克隆。克隆人,即使是那些克隆人,也不會指定參考文獻,像往常一樣獲得完整拷貝。 – jthill

回答

1

您可以創建一個「淺層」克隆,但它只會生成一個只讀存儲庫,因爲您無法從中讀取或插入它。 下面是一個命令: git clone repoUrl.git --depth 1 --branch branch_name

1

我認爲最接近你會得到這裏使用--depth選項git clone來限制獲取拉歷史的量這也意味着,你不會有所有可用於git log和朋友的歷史記錄 - 您無法針對遠程存儲庫運行git log

這就是說,還有一些其他的位需要考慮。 Git確實試圖將類似對象打包在一起,在構建包時給它提供良好的壓縮。這確實意味着文件本身需要以某種方式類似。這對於源代碼非常適用,但對於一些二進制格式來說可能不太好。

對於大文件,Git也不是那麼棒。 Git傾向於將整個文件加載到內存中,儘管已經做了一些努力來減少它。所以你可能想做一些測試,以確保你不會碰到任何邊緣。

+0

在版本控制下我們已經有了我們的數據(不是二進制)。 Git的作品,但有時並不真實。 – jlconlin

+0

我認爲使用'--depth 1'可以很好地工作,但它並沒有改變我的倉庫的大小。我的起源'.git'目錄是7.7 GB,'--depth 1''.git'目錄是7.2 GB。我使用的命令是'$ git clone --depth 1 file:/// path/to/repo new_repo' – jlconlin

+0

您可能想要考慮只使用'--single-branch'選項來使用'master' - 您可能會爲此需要更新版本的Git。否則,所有裁判的深度都是1,這可能比你討價還價多一點(如果你有10個其他分支,git會確保這些對象也在那裏)。或者,您可以編輯'.git/config'並將refspec行更改爲僅反映所需的ref(可能只是'master')。您可能需要運行'git gc'讓git從您的本地克隆中移除不必要的對象。 – jszakmeister

1

是否可以在git中克隆存儲庫而不保留所有修訂版本?

用也沒有多大的多學科,您可以使用--reference庫僅保存一個儲站點範圍的回購,其中「現場」是「可以訪問一個共享的文件系統的機器」定義爲大,穩定的部分。

爲了使其安全的,因爲你的共享文件系統:

  1. 讓裸露的回購協議是隻發佈了穩定的引用。最簡單的可能是做一個完整的克隆,然後刪除所有不穩定的。

    --baregit cloneu://r/l/to/real/upstream/path/to/reference/repo
    cd !$
    git tag -dall the tags that have even a whiff of instability about them
    git branch -Devery branch
    git rev-parseany-tag> HEAD

  2. 使用此回購作爲參考。當克隆真正的上游,

    git clone --reference /path/to/reference/repo u://r/l/to/real/upstream

這就是真正的一切就是在內部使用它。學科的一部分是,你必須確保帶有你的軟件倉庫的文件系統對於引用它的任何東西都是可用的,並且對你的軟件倉庫沒有任何改變會留下未提交的提交。 chmod -R a-w會做得很好。

如果有人克隆這種方式他們的筆記本電腦,並把他們的地方不訪問車廠,他們需要首先從車廠斷開他們的克隆:

# disconnect from depot: 
git repack -Ad \ 
&& rm .git/objects/info/alternates 

注:

對於真正動力不足的筆記本電腦和非常大的回購,重新打包可能是不方便的。另一種方法是:

# disconnect from depots, minimal cpu load for underpowered localhost: 
cp -r $(cat .git/objects/info/alternates) .git \ 
&& rm .git/objects/info/alternates 

也有可能收拾「只是你需要什麼」與git pack-objectsgit rev-list一個客場之旅。這裏有一種方法可以做到這一點:

# pack up what I have locally, mark it as reliably-present: 

git repack -l 
for pack in .git/objects/pack/*.pack; do 
    touch $pack.keep 
done 

# pack up everything I still don't have that might actually be useful 
# no need to list tags that are ancestors of other tags here: 

git rev-list --objects --all ^tag-I-dont-need ^another ^etc \ 
| git pack-objects --honor-pack-keep .git/objects/pack/pack 
mv .git/objects/info/alternates{,.inaccessible} 

# let git gc at what's here when needed 
rm .git/objects/pack/pack-*.keep 

並在返回摺疊時,將備用文件放回。

1

如果克隆將在相同的文件系統捲上,則使用git clone --local

它使用硬鏈接來節省空間。

查看git-clone手冊頁。

這意味着您可以擁有完整的歷史記錄,而不會增加空間需求。