2010-08-20 124 views
0

幾篇文章討論從GIT中刪除文件或目錄 - 但他們沒有解釋如何將這些更改壓入主存儲庫。如何從GIT中刪除目錄後提交

例如,this工作只是正常刪除的目錄,但是當我試圖推動這一變化的主要混帳回購協議,我否認:

! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to '/repo/project.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes before pushing again. See the 'non-fast forward' 
section of 'git push --help' for details. 

的是,真正推動這最後一步主要回購和實際刪除該目錄?

+1

我猜你不僅僅是通過'git rm'移除了目錄,而且你還重寫了整個歷史。如果您更改舊提交,則無法在服務器上留下的提交之上進行提交。 – 2010-08-20 07:30:25

回答

2

當您如此積極地刪除某些內容時,您會重寫歷史記錄。因此,上游存儲庫拒絕您的更改,因爲這會導致歷史記錄丟失。在這種情況下,您將需要使用

git push --force 
+1

...但你應該明白你在做什麼,並確保你真的想要這樣做。看到我的答案。 – Cascabel 2010-08-20 14:51:24

+0

你很少想要強制推送。 99%的時間,缺點超過了好處。 – brycemcd 2010-08-20 14:54:35

+0

是的 - 欣賞警告並瞭解它絕對不是一個好的做法 - 尤其是在小組環境中。就我而言,這只是我和我意外地犯了一些自動生成的代碼,我不想在回購(我想感覺像Git Ninja :),這是我需要更好的一個邊緣案例瞭解如何制定。 – 2010-08-20 15:29:31

1

尼克·劉易斯的回答是足夠了,但我只想補充一些重點,超過將適合評論。以下是git filter-branch的手冊頁面:

警告!重寫的歷史將爲所有對象具有不同的對象名稱,並且不會與原始分支會聚。您將無法輕鬆地將重寫的分支推送並分發到原始分支的頂部。 如果您不知道的全部含義,請不要使用此命令,並且無論如何都要避免使用它,如果簡單的單一提交就足以解決您的問題。 (請參見「恢復上游REBASE」一節中git-rebase(1)關於改寫歷史的發佈進一步的信息。)

斜體加着重號 - 這是非常重要的。過濾器分支確實會重寫歷史記錄,它會讓任何從您的回購中克隆/拉出來的任何人都感到害怕,而且這很可怕。在你放棄它之前,你應該真正瞭解所有這些。這裏的大多數人在提供filter-branchrebase;我認爲在這裏有一個非常強烈的重複是合適的,在這個問題的答案是push --force爲了完全重寫公共回購的歷史。這是一個可怕的操作。