2017-05-30 200 views
0

我的主要開發中有很多分支。GIT - 使克隆變淺

我在生產服務器上使用GIT克隆。我最近發現了--single-branch,它使用了很少的空間來編寫git文件。有沒有什麼辦法可以將現有的git安裝轉換爲更淺的版本(就像我做了 - 單分支),而無需重新初始化整個事物。

回答

1

我會假設單分支回購會更小。這與我的經驗相符,但考慮到包文件的處理,我不能100%肯定地說,這將始終有效。在最壞的情況下,我想你可以定期在選項2結束時運行「清理程序」,以確保本地最小化。

也就是說......

如果你有一個回購直接進行訪問(即可以與它互動,本地存儲庫),那麼你可以做你問什麼。但在我看來,重新克隆更容易。我假設你不想重新克隆,因爲你不想從生產中刪除工作副本 - 即使是暫時的。如果是這樣的話,有一種方法可以解決它。但爲了萬一有其他原因不能重新克隆,我還會闡述另一種方法。

選項1 - 再克隆,同時保持工作樹

基本上在這裏做什麼只是創建一個新的,獨立的克隆,然後交換.git/文件夾上的老回購。我通常不建議手動修改.git/文件夾;所以這是這種方法的缺點,我們需要小心。

cd /path/to/old/repo 
mv .git ../backup.of.old.repo.git 
cd .. 
git clone --single-branch --branch master url/of/origin new.repo 
mv new.repo/.git repo 

然後檢查git status,做任何其他的驗證是有意義的,以確保一切工作丟棄backup.of.old.repo.git之前預期。

選項2 - 修改現有回購配置

的最主要的,--single-branch確實是修改規則取爲遠程。你可以做到這一點很容易不夠

git config remote.origin.fetch +refs/heads/master:refs/remotes/origin/master 

但你仍然回購有所有其他部門(因爲它是如何創建的);它將來不會去尋找它們。清除現有的對象是更難的部分。

的清潔步驟:

所以首先你需要擺脫所有不需要裁判的。你可以通過蠻力(從.git/packed-refs刪除條目,從.git/refs/刪除文件),但要小心,如果你這樣做。或者,您可以使用git branch --deletegit tag --delete等驗證所有消失與git for-each-ref之類的東西。

但僅僅因爲所有的裁判都沒有了,並不意味着什麼都不能達成不需要的提交。你也必須加註reflog。有這個git命令,但我從來沒有很多運氣讓他們做我想做的。如果你知道本地reflogs不需要其他任何東西,你可以rm -r .git/logs

但僅僅因爲沒有任何東西可以達到不需要的提交併不意味着它們已經消失。現在你需要git gc --aggressive --prune=now

而這應該最終減少回購的規模,假設那些其他分支佔了很大的空間...

-1

當然,只是做:

# configure to only fetch master branch 
git config --replace-all remote.origin.fetch +refs/heads/master:refs/remotes/origin/master 
# delete all remote tracking branches 
git for-each-ref refs/remotes/origin --format='%(refname)' | xargs -l git update-ref -d 
# reinstante the still fetched branch ref 
git fetch origin 
# repack the repository to throw out the dangling commits from the deleted branches 
git repack -adl --depth=250 --window=250 

這隻雖然清理遠程分支機構。
獲取的標籤不可識別,它們與本地創建的標籤相同。
如果您沒有本地標記或不介意丟失或重新標記它們,你可以更換

git for-each-ref refs/remotes/origin --format='%(refname)' | xargs -l git update-ref -d 

通過

git for-each-ref refs/remotes/origin refs/tags --format='%(refname)' | xargs -l git update-ref -d 

也得到了刪除標記,不點到仍然提取的分支的歷史。