git revert用法 git退版本



如何從我的git回購中刪除未引用的blob (7)

...並且不用再做了,我可以向你展示這個有用的腳本, git-gc-all ,保證刪除所有的git垃圾,直到它們可能會出現額外的配置變量:

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 \
    -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "[email protected]"

你可能還需要先運行這些東西,哦,親愛的,git很複雜!

git remote rm origin
rm -rf .git/refs/original/ .git/refs/remotes/ .git/*_HEAD .git/logs/
git for-each-ref --format="%(refname)" refs/original/ | xargs -n1 --no-run-if-empty git update-ref -d

我把這些放在一個腳本里,在這裡:

http://sam.nipl.net/b/git-gc-all-ferocious

編輯:您可能還需要刪除一些標籤,謝謝Zitrax:

git tag | xargs git tag -d

https://ffff65535.com

我有一個GitHub倉庫,它有兩個分支 - master和release。

發行版分支包含二進制分發文件,這些文件有助於實現非常大的回購大小(> 250MB),所以我決定清理乾淨。

首先我通過git push origin :release刪除遠程發布分支

然後我刪除了本地發布分支。 首先我嘗試了git branch -d release ,但是git說: “錯誤:分支'release'不是你當前HEAD的祖先。” 這是真的,所以然後我做了git branch -D release強制它被刪除。

但是我的存儲庫大小,無論是在本地還是在GitHub上,仍然很大。 然後我跑過了通常的git命令列表,比如git gc --prune=today --aggressive ,沒有運氣。

按照Charles Bailey在SO 1029969的指示,我能夠獲得最大斑點的SHA1列表。 然後,我使用SO 460331的腳本來查找斑點......並且最大的五個斑點不存在,儘管找到了更小的斑點,所以我知道該腳本正在工作。

我認為這些博客是發布分支的二進製文件,並且在刪除該分支之後,它們不知何故被留下。 什麼是擺脫他們的正確方法?


git gc --prune=now ,或者低級的git prune --expire now


嘗試使用git-filter-branch - 它不會刪除大的blob,但可以刪除您從整個repo中指定的大文件。 對我來說,它可以將回購大小從幾百MB降低到12 MB。


在做git filter-branchgit gc ,你應該查看你的倉庫中存在的標籤。 任何具有自動標記功能的實際系統(如持續集成和部署)都會使不需要的對象仍然被這些標記引用,因此gc無法刪除它們,並且您仍然會想知道為什麼repo的大小仍然如此之大。

擺脫所有不想要的東西的最好方法是運行git-filtergit gc ,然後將master推到新的裸回購。 新的裸回購將有清理過的樹。


有時候,“gc”沒有什麼好處的原因是有一個未完成的rebase或基於舊的提交存儲。


正如在這個回答中提到的, git gc實際上可以增加回購的大小!

另請參閱此主題

現在git有一個安全機制,在運行' git gc '時不會立即刪除未引用的對象。
默認情況下,未引用的對象將保留2週。 這樣可以讓您輕鬆恢復意外刪除的分支或提交,或者避免一個剛剛創建的對像在正在創建但尚未引用的對象可以被並行運行的“ git gc ”進程刪除。

因此,為了將寬限期放在包裝但未引用的對像中,重新包裝過程會將未包含的對像從包裝中拉出,形成鬆散的形式,以便它們能夠老化並最終被修剪。
對像變得未被引用通常不是那麼多。 擁有404855個未引用的對象相當多,並且首先通過克隆發送這些對像是愚蠢的,並且完全浪費了網絡帶寬。

無論如何...為了解決你的問題,你只需要運行帶有--prune=now參數的' git gc '來禁用這個寬限期,並立即擺脫那些未被引用的對象(只有在沒有其他git活動正在在工作站上應該容易確保的同時放置)。

順便說git gc --aggressive ,在後面的git版本(或' git repack -a -f -d --window=250 --depth=250 ')中使用' git gc --aggressive '

同樣的線索提到

 git config pack.deltaCacheSize 1

這將delta緩存大小限制為一個字節(有效禁用它),而不是默認的0,這意味著無限制。 因此,我可以在具有4GB RAM的x86-64系統上使用上面的git repack命令並使用4個線程(這是一個四核)重新包裝該存儲庫。 儘管如此,居民內存使用增長到接近3.3GB。

如果你的機器是SMP,並且你沒有足夠的RAM,那麼你可以將線程數量減少到只有一個:

git config pack.threads 1

另外,你可以通過--window-memory argument進一步限制內存使用,以' git repack '。
例如,使用--window-memory=128M應該對增量搜索內存使用情況保持合理的上限,但如果回購包含大量大文件,則可能導致較少的最佳增量匹配。

在過濾器分支前面,您可以考慮(謹慎) 此腳本

#!/bin/bash
set -o errexit

# Author: David Underhill
# Script to permanently delete files/folders from your git repository.  To use 
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2

if [ $# -eq 0 ]; then
    exit 0
fi

# make sure we're at the root of git repo
if [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1
fi

# remove all paths passed as arguments from the history of the repo
[email protected]
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD

# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune

要添加另一個技巧,不要忘記使用git remote prune在使用git gc之前刪除您的遙控器的過時分支

你可以看到他們與GIT分支-a

從github和分叉存儲庫中獲取時通常很有用......





git