2012-07-09 110 views
7

我們正在運行一箇中央git存儲庫(gforge),每個人都從中拉出並推送。不幸的是,一些不合適的同事決定將幾個10-100Mb的jar文件放入回購庫是個好主意。由於這個原因,我們使用的服務器已經耗盡了磁盤空間。從git中刪除大型提交

我們才意識到這一點,當時已經太遲了,大多數人都拉了新的巨大回購。如果問題沒有得到解決,那麼我們可以做一個重定位來分割那些巨大的提交併修復它,但是現在每個人都已經從中撤出了,那麼刪除提交的最好方法是什麼?刪除大文件),然後有這個而不是當每個人都想要拉/推/從回購時導致混亂?

這應該是腳本小回購,但現在是大小約爲700M :-(

回答

6

檢查了這一點https://help.github.com/articles/remove-sensitive-data。在這裏,他們寫從Git倉庫刪除敏感數據,但可以很好的使用它從您提交移除大型文件。

+1

我以前經歷過這個指南,但是在我拋棄了提交之後會發生什麼?人們已經拉動了怪物的承諾。可能發生的事情是有人會先進行本地提交然後進行推送,它會呻吟說需要合併,所以他們會合並並推送,並且怪物提交會再次返回。如何確保不會發生這種情況(將所有發送給他們的電子郵件都不太可能奏效!) – agentgonzo 2012-07-09 15:44:07

+0

刪除不需要的文件後,始終建議您將它們添加到.gitignore文件中。這樣,Git將停止跟蹤這些文件並阻止它再次被推送。 – 2012-07-10 05:18:46

+0

Sanhka,它並不妨礙他們被推 - 它阻止他們承諾。因此,他們已經承諾,推動會讓他們回來。 – agentgonzo 2012-07-11 09:57:54

8

,以避免混亂的最簡單的方法就是給服務器更多的磁盤。

這是一個艱難的一個。卸下文件需要從歷史中刪除,也這隻能用git filter-branch來完成,這個命令,比如說wo ULD從歷史中刪除<file>

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <file>' \ 
--prune-empty --tag-name-filter cat -- --all 

問題是這樣的重寫SHA1哈希值,這意味着對球隊每個人都需要重新設置一個新分支版本或風險一些嚴重的頭痛。如果沒有人正在進行工作,並且你們都使用主題分支,這很好,很好。如果你更集中,你的團隊很大,或者他們中的許多人在工作時保持髒的工作目錄,沒有一點混亂和不和諧的事情就沒有辦法做到這一點。你可以花很長時間讓每個人的本地工作正常。這寫,git filter-branch可能是最好的解決方案。只要確保你有一個計劃,你的團隊瞭解它,並確保他們備份他們的當地知識庫,以防萬一進行中的重要工作丟失或消失。

一個可能的方案是:

  1. 得到球隊產生了正在進行的工作,像git diff > ~/my_wip的補丁。
  2. 讓團隊爲其承諾但未共享的作品生成補丁:git format-patch <branch>
  3. 運行git filter-branch。確保在發生這種情況時團隊知道不要拉。
  4. 讓團隊發出git fetch && git reset --hard origin/<branch>或讓他們重新克隆存儲庫。
  5. 將以前承諾的工作應用於git am <patch>
  6. 將他們正在進行的工作應用於git apply,例如, git apply ~/my_wip
+0

爲服務器提供更多的磁盤空間並不是一個理想的解決方案,因爲在家工作的人們仍然需要通過其寬帶連接來提取數百MB,而這應該是幾百KB。我可能不得不做一個過濾分支併發送大量電子郵件,說「你的東西會失敗 - 隱藏你的本地更改,導出爲補丁,然後刪除你的本地回購 - 然後重新啓動」 – agentgonzo 2012-07-09 15:45:59

+0

是的,我盯着一個類似於這在幾個月前。你的想法或多或少正是我所做的,除了我的同事對修補程序有點不安。我最終爲他們做了。花了一個下午。我編輯了你的計劃,並添加了一些命令,以防某些人稍後絆倒你。 – Christopher 2012-07-09 16:04:51

4

除了其他答案,您可能需要考慮添加一些針對未來巨型jar文件的先發制人的保護措施,其形式爲禁止用戶使用的預先接收掛鉤(或至少「非管理員用戶「)推送非常大的文件或名爲*.jar的文件,或任何看起來最好的文件。

我們之前已經做過這種事情,包括禁止特定的提交ID,因爲某些用戶無法獲得「將工作保存在臨時分支上,重置並拉出並重新應用工作,減去巨型文件「。

請注意,預接收掛鉤運行在一個相當有趣的上下文中:文件實際上已上傳,只是引用(通常是分支頭)還沒有真正改變。您可以防止分支機構發生變化,但您仍將使用(臨時性的,直到gc'ed)的磁盤空間和網絡帶寬。

0

使用filter-branch!

git filter-branch --tree-filter 'find . -name "*.jar" -exec rm {} \;' 

然後,只需清除所有沒有任何文件將它們與提交:

git filter-branch -f --prune-empty -- --all 
+0

'--index-filter'可以和'--tree-filter'基本相同,但速度更快。 – 2015-05-08 08:10:43

-1

中的gforge這裏的傢伙。甚至認爲這主要是一個git的問題,我想提供兩件事情:

  1. Starting in GForge 6.3,網站管理員可以識別正在使用過多的磁盤項目,以及舊的和孤立的項目。這可以幫助您避免全盤情況,特別是如果您有很多獨立的團隊和項目。
  2. 在GForge中輕鬆實現git鉤子(一般SCM鉤子)。站點管理員可以配置任意數量的鉤子命令,然後項目級別的人員可以選擇他們想要的項目鉤子。添加一個防止文件的某些類型(或大小?)的鉤子將非常適合此功能。