2014-03-26 39 views
3

我想刪除一些有人推入我們的git倉庫的大文件,所以其他人可能會從倉庫中取出而不下載它們。從全局刪除Git倉庫中的文件

我已經嘗試忽略這些文件,並從主機上刪除/委託/推送它們,但沒有運氣。

我可以訪問服務器和裸回購

謝謝!

回答

3

git filter-branch是你的答案在這裏。

從裸倉庫中,您有幾個選擇。

1)您想從每次提交中刪除一個或多個文件。

$ git filter-branch --index-filter \ 
       'git rm --cached --ignore-unmatch junk/bigfile' -- --all 

$ git filter-branch --index-filter \ 
       'git rm --cached --ignore-unmatch -r junk/' -- --all 

2)你想找到一個文件,而不管其路徑,並刪除其存在的所有歷史記錄..

$ git filter-branch --index-filter \ 
     'mv $GIT_INDEX_FILE /tmp/index; 
     GIT_INDEX_FILE=/tmp/index git ls-files -s| 
     grep -v FILENAME|git update-index --index-info' -- --all 

3)你想找到一個特定的提交文件,並只刪除該文件。例如,如果您提交一個較大的二進制文件,然後用較小的文件替換該文件,則需要找到包含原始大文件的blob,並將其刪除。

$ git ls-tree -r <commit> | grep SOMEFILE 
100644 blob 4cbedad5b4ab88f700bf27ae5a32bdb3627fa632 SOMEFILE 
$ git filter-branch --index-filter \ 
     'mv $GIT_INDEX_FILE /tmp/index; 
     GIT_INDEX_FILE=/tmp/index git ls-files -s| 
     grep -v 4cbedad5b4ab88f700bf27ae5a32bdb3627fa632| 
     git update-index --index-info' -- --all 

您每次執行此操作時,都會將當前的「refs」或分支頭集備份到refs/original目錄中。您可以隨時將這些內容複製回參考資料頭以恢復您的存儲庫。

如果要刪除的文件導致空的提交,請將'--prune-empty'選項添加到git-filter-branch命令行。這將允許git完全放棄提交。

只要refs/original包含原始頭部,git就不會修剪被刪除的文件或斑點。

一旦你對結果完全滿意,倉庫本身可以收縮

$ rm -rf refs/original 
$ git fsck 
$ git prune 
$ git gc 
$ git repack -a 

和你做。

警告:git-filter-branch將REWRITE EVERY COMMIT。確保 沒有未改變/未改變的工作。這樣做之前,每個人都必須承諾並推送 。

完成後,每個人都應該做到以下幾點 $混帳取--all $ git的復位 - 硬@ {}上游

+0

請注意,過濾器分支步驟可能需要花費數小時才能處理歷史悠久的大型存儲庫。 – yoyo

+0

1)是BFG不會刪除的文件的生命保護程序,因爲它是「髒的」,即它在分支中被引用 –

1

您必須重寫歷史使用git filter-branch或類似的技術。看到這個例子刪除該文件Rakefilein the github help

git filter-branch --force --index-filter \ 
    'git rm --cached --ignore-unmatch Rakefile' \ 
    --prune-empty -- --all 

你應該知道,每個人都已經克隆你的資料庫需要硬及其分支機構重置遙控器上的一個或他們會重新引入的文件。

+0

「--tag-name-filter cat」是多餘的。除非您計劃更改標籤名稱,否則不要添加標籤名稱過濾器。 – Dave

+0

@Dave直接從github幫助頁面複製它。謝謝! – TimWolla

1

如果你想刪除已COMMITED自己的文件,你可以使用rebase命令簡單地消除提交。

1)檢出一個工作副本

$ git clone -s bare_repo.git 
$ cd bare_repo 

2)使用git日誌找到犯

$ git log 
384b1a3306c1247559563f855e2adf5ced80678b good commit 
8abb0e7cf306ceb209cb5c4aa3b422b9460fdb64 bad commit 

3)使用git重訂重寫歷史,留下的是犯

$ git rebase -i 8abb0e7cf306ceb209cb5c4aa3b422b9460fdb64^ <--- note the ^** 

4)錯誤的提交應該是第一行。刪除該行,保存並退出。 5)git-log應該顯示你的歷史記錄,不好的提交消失了。 5)將變化推回。使用-f標誌來強制更新

$ git push -f origin master 

6)現在,您可以刪除工作樹

0

另外還有BFG Repo-Cleaner是多少,比git的過濾分支快得多。但是,它不會刪除分支中引用的文件。請諮詢Dave's answer刪除這些。

相關問題