2017-06-20 52 views
0

我在本地Git存儲庫中有約50次提交。我對當前HEAD中的某個特定文件做了一些更改,並且希望將這些文件更改更新爲所有以前的提交。是否有可能在git中實現這一點?更改之前提交的當前數據中的文件內容

+1

你爲什麼要這麼做? git的想法是跟蹤變化歷史。 – Fede

+0

@Fede - 有幾個很好的理由(以及許多不太好的理由)爲什麼有人可能會這樣做。我並不反對任何人考慮這樣做應該檢查並重新檢查他們的推理,但最終問題是什麼 - 如果OP認爲他們的歷史在更換特定文件時更有價值,那不是我們的項目爭論。 –

回答

1

UPDATE - 儘管我的原始答案中的命令有效,但在反射時它可能不是在索引過濾器中使用的最佳方法;添加了一些關於此的評論


這是可能的,但是有成本。

您所描述的是「歷史重寫」,它將更改每個提交的提交ID。如果你單獨使用這個回購,並且你還沒有使用提交ID(SHA)值作爲任何東西(比如文檔或者其他),那麼這很可能是好的。

如果其他人也使用回購(或者如果您有多個克隆),您需要協調切入。基本上我的建議是安排一段時間,當所有更新被推到一個普通的回購站(可能是起源),然後放棄所有的克隆,然後重寫並替換原點,然後重新克隆。從技術上講,您不必這樣做,但請參閱git rebase文檔(實際上適用於任何歷史重寫)中的「從上游重建中恢復」。

因此,如果您決定繼續進行重寫,最簡單的方法可能是使用git filter-branch。 (如果你的回購某些假設屬實,那麼一個rebase爲基礎的方法可以工作,但filter-branch是更普遍適用。)

git filter-branch --index-filter 'git reset master -- file/to/be/rewritten' -- --all 

這產生了一些「備份」裁判,你會想刪除一旦你已驗證結果。

注意,我本來建議

git filter-branch --index-filter 'git checkout master -- file/to/be/rewritten' -- --all 

這也似乎工作;但reset命令與更新索引更純粹相關,因此可能是更好的選擇。

+0

順便說一下,如果您有任何提交,其中唯一改變了父項的是您要替換的文件,那麼該提交現在將與其父項完全匹配。如果你願意,你可以通過在'filter-branch'中加入'--prune-empty'選項來移除這樣的提交 –

相關問題