2012-05-20 227 views
22

我試圖從我的git存儲庫中拆分出一個子項目。 但不像 Detach (move) subdirectory into separate Git repository 我沒有在它自己的子目錄中(並將其移入並執行上述操作只會生成移動後的歷史記錄)。從git歷史記錄中刪除已刪除的文件

我克隆了一個分支,我想從中分支出子項目到它自己的存儲庫中,並刪除了子項目沒有使用的所有東西,所以基本上我可以使用它作爲我的子項目的存儲庫。

現在我想擺脫不再存在於此存儲庫中的所有文件的歷史記錄,以便只保留文件的歷史記錄,以便將其存入後代。

我認爲它必須能夠使用Git濾波器分支,但我無法弄清楚如何

提前感謝

+0

另請參見[具有僅當前跟蹤文件的複製歷史記錄的新回購](http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files) 。 – 2013-07-27 22:11:01

回答

5

Here are some instructions to do what you want.

這將刪除file_to_remove

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all 
+19

事情是我想保留在工作目錄中的文件和他們的歷史記錄,並讓git忘記所有其他文件。首先找到所有被刪除的文件並用上面的命令刪除它們會非常麻煩,這就是爲什麼即使我發現它沒有太多的用處 –

1

好吧,現在我正在嘗試使用以下技術,如果它能正常工作,則會報告回來,因爲它似乎很長時間: 在一個的zsh或bash在克隆庫

git log --diff-filter=D --summary <start_commit>..HEAD | egrep -o '*[[:alnum:]]*(/[[:alnum:].]*)+$' > deleted.txt 

讓所有被刪除的文件

for del in `cat deleted.txt` 
do 
    git filter-branch --index-filter "git rm --cached --ignore-unmatch $del" --prune-empty -- --all 
    # The following seems to be necessary every time 
    # because otherwise git won't overwrite refs/original 
    git reset --hard 
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 
    git reflog expire --expire=now --all 
    git gc --aggressive --prune=now 
done; 

這可能都知道:dangeours爲您的數據只能對克隆嘗試。

+0

你最終發現了什麼? –

+1

它運行得如此之慢的原因是因爲你對每個文件運行'git filter-branch'命令***一次***以及一堆其他命令('git gc'不是一個廉價而快速的命令來運行)而不是運行它***一次所有文件***,所以它可能是非常低效的。請參閱[新回購,僅複製當前跟蹤文件的歷史記錄](http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files)。 – 2013-07-27 22:12:27

+0

將推送到github或gitlab清理遠程存儲庫? –

相關問題