順便說一句,刪除文件完全是最簡單的選擇(雖然你看,這不完全是簡單的),前提是你不需要的文件在您的回購協議。另一個選擇是使用像git lfs
這樣的工具來允許你的倉庫引用文件,而不需要直接將文件放入你的倉庫。這解決了與git
中的大文件相關的許多問題,如果您確實需要該文件,應該考慮這些問題;但重寫回購使用lfs
爲一個已經提交的文件是另一個完整的話題...
所以,回到刪除的問題。爲了提供多一點背景:
Git中有三個地方的文件會被發現。
1)工作樹木 - 僅僅是純文本文件,你努力。 git
沒有特別的努力來保存這裏的數據,它只存在於本地。您可以通過git
以外的方式或使用git rm
(特別是如果您還需要將其從索引中刪除)從這裏刪除文件。
2)索引 - 這是「分階段」進行新提交的文件。當你說git add
你更新索引。 git
將掛在這裏獨立於工作副本的數據,但仍然只是本地的,並沒有特別的努力來保存歷史。 git rm
將從索引中提取文件。
3)數據庫 - 這是你的項目的歷史存在。當你說git commit
時,將表示項目的「對象」添加到數據庫中。該數據庫是git
保留歷史,你必須走出去的方式,使git
從這裏丟失任何數據。數據庫基本上是在push
和fetch
操作期間在回購期間共享的內容。 git rm
對數據庫沒有影響。
現在,正如其他人所指出的,因爲你已經創建了一個提交包含文件,你需要做的比git rm
多。第一步是重寫任何包含提交文件的提交文件的歷史記錄。
有人說你需要解決的承諾是「介紹」的文件;這是誤導。您需要處理全部對該文件的引用(或者在技術上,對代表該文件的BLOB
對象)。
因爲rebase
解釋,相對於他們的父母他們的變化方面承諾,它可以在一個相對便捷的方式處理這個問題,如果有的不是很多分支與合併加入的文件後發生的情況。例如,如果文件是在提交A
中創建的,並且唯一可以訪問A
的引用是master
,並且在master
中沒有合併提交比A
更新,那麼rebase
是最簡單的解決方案。假設A
不是根提交,
git rebase -i A^ master
(其中A^
是的SHA提交所引入的文件);但如果A
是根提交,這意味着A^
是無效的,那麼
git rebase -i --root master
在彈出待辦列表,您更改A
編輯命令,給出的提示進行編輯時提交你刪除文件,然後告訴rebase
繼續。
在這一點上,可能git push
將工作,因爲git
不必發送整個數據庫;它只是發送你告訴它推的參考文獻的歷史。但不要混淆:你仍然尚未從本地數據庫中刪除文件。要做到這一點,你必須確保沒有任何東西(即使是reflog)可以到達該文件,然後使用git gc
。如果您已成功從所有裁判的歷史記錄中刪除該文件,則最終會發生這種情況;這可能是文件,除非你受限於本地存儲。
在上述過程中有幾個重要的假設,如果您剛剛提交了這些假設可能存在的文件。但是如果存在多個分支可以達到承諾A
,並且/或者如果有合併提交可以達到A
,那麼執行rebase
會變得更加困難。那時你會看到git filter-branch
或BFG Repo Cleaner
作爲解決方案。在這兩項中,BFG
對於這項任務來說要簡單得多,速度更快;如果你搜索它,你可以找到許多來源(包括一些SO條目),概述了它的用法。因爲filter-branch
更通用,所以使用起來更加困難,但它又是「內置」的 - 無需下載其他軟件。
所有這些技術都會重寫歷史記錄。由於您無法推送現有的歷史記錄,因此這可能不是什麼大問題(假設您沒有第二個已經推送更改的遙控器)。
https://rtyley.github.io/bfg-repo-cleaner/ – Sirko
你可以創建一個新的分支,拉最新的,並從當地移除然後puush到主? – AK47
或多一點上下文:https://help.github.com/articles/removing-sensitive-data-from-a-repository/ – Boldewyn