2014-12-01 123 views
2

因此,我一直在尋找正確的方法來做到這一點,而我只是沒有明確的命令行知識。從git歷史記錄中刪除未使用的資產

我有一個git repo,裏面有很多資產。這就像我知道的主要罪。

回購已經變得太大了。我想清理它,這樣我可以以編程方式從整個回購歷史記錄中刪除HEAD中不存在的所有文件。我已經看到了可以指定文件路徑的方法,但實際上,我正在說1000個以上的文件,這些文件已從我們的最終產品中刪除,而我真的不想再購買我的repo文件。

更新: 我清理了本來不應該在那裏的所有資產的回購。我現在真的只有源代碼以及一些應該在那裏的資產。我真的很喜歡保留所有源代碼的所有歷史記錄......所以我真的想要從歷史中刪除已刪除的文件,同時保留當前存在的歷史記錄。這是目標。我很確定它可以使用git filter-branch來完成 - 但我對此不夠了解。

+0

可能重複https://stackoverflow.com/questions/61212/remove-local-untracked-files-from-my-current-git-branch – DRC 2014-12-01 16:47:28

+0

查看更新。我不這麼認爲。 – normmcgarry 2014-12-01 17:05:21

+0

此時您有一個花園品種過濾分支問題。就像'git filter-branch --index-filter'git rm -rf --cached --ignore-unmatch $ files「HEAD」加上過濾器分支文檔中的其他清理步驟應該適合您。 – 2014-12-01 17:55:03

回答

2

使用BFG Repo-Cleaner,更簡單,更快速的替代git-filter-branch專門針對Git的歷史記錄中刪除不需要的文件而設計的。

,所以我可以編程方式刪除不HEAD從回購

默認情況下的整個歷史存在了所有文件,BFG的「保護」在你的腦袋中的所有文件提交,但會刪除符合條件的其他文件。

您應仔細按照usage instructions,但最核心的部分就是這個:

$ java -jar bfg.jar --strip-blobs-bigger-than 1M my-repo.git 

超過1MB大小的任何文件 - 不在您的最新提交 - 將從您的Git中移除資料庫的歷史。如果您有一個正常的,小於1MB的源文件,您仍然想要刪除,則可以使用--delete-files--delete-folders選項指定它們。

該BFG通常至少比運行git-filter-branch10-50x,並且通常更易於使用。

完全披露:我是BFG Repo-Cleaner的作者。

+2

老實說,我一直試圖整天使用你的程序,因爲它聽起來很完美。我沒有意識到它默認保護HEAD文件。這工作完美。甚至不知道我今天早些時候的問題,我無法得到這個工作。非常感謝!此外,它似乎你需要運行: $ git reflog expire --expire = now --all $ git gc --prune = now --aggressive – normmcgarry 2014-12-01 19:37:54

0

您可以對存儲庫進行淺層克隆,並將其作爲新的「主」存儲庫,並將舊的存儲庫保存到其他位置。

git clone --depth=1 oldrepo newrepo

這樣被刪除的所有文件不再在新的克隆可達,所以他們不會被存儲爲Git對象。

不利的一面是,這隱藏了文件更改歷史記錄,但它仍然可以在您的原始回購庫中訪問。

+0

查看更新...我寧可不採取這種方法。 – normmcgarry 2014-12-01 17:06:46

0

先備份你的數據,這個勉強測試!

git filter-branch --tree-filter 'for i in $(git diff master --summary --diff-filter=A | grep "create mode" | cut -d " " -f 5-); do 
    rm "$i" 
done' --prune-empty HEAD 
相關問題