簡體   English   中英

如何刪除以前添加的git子樹及其歷史記錄

[英]How to remove previously added git subtree and its history

許多月前我在我的git存儲庫中添加了一個子樹。 該子樹包含多個文件夾和文件。 我添加了子樹而不是創建子模塊(如推薦的那樣)。 現在我意識到我只想要子樹中的一個文件,而不是其他文件。 更糟糕的是,當其他人clone我的存儲庫時,他們獲得的並不是預期的 - 與子樹和我創建的其他代碼存在一些沖突。

我可以隨身攜帶文件/文件夾

git rm subtree–folder1 subtree_folder2 subtree_files.*

但是,我仍然從子樹中留下了冗長的提交歷史。

自從我最初添加子樹以來,我已經完成了相當多的開發,並且不會丟失我生成的提交歷史記錄。

總之,這就是我想要的:

  1. 刪除所有子樹文件/文件夾。
  2. 忘記所有子樹提交的歷史。
  3. 只留下我的代碼和我的歷史。

這可能嗎?

PS。 一個可能的復雜因素是我將我希望保留的單個頭文件從子樹移到我代碼中的某個文件夾。 我希望這不是讓我忘記子樹歷史的原因。

嘗試

從遠程服務器重新結賬后,我有以下內容:

$ ls
.git             CMakeLists.txt   Read.cpp         logging.conf
.gitignore       ENDF6            TestData         src
.sparse-checkout LICENCE          doc              test
.travis.yml      README.md        include          tools

其中.gitignore只有:build / debug /

當我按照建議嘗試命令時,我沒有得到非常滿意的回復:

$ git filter-branch --index-filter 'git rm --cached -rf test tools src doc LICENCE README.md .travis.yml' HEAD
Rewrite 2fec85e41e40ae18efd1b130f55b14166a422c7f (1/1701)fatal: pathspec 'test' did not match any files
index filter failed: git rm --cached -rf test tools src doc LICENCE README.md .travis.yml

我不確定為什么它顯然存在test問題。 我很困惑。

您需要使用filter-branch和--prune-empty選項來刪除不再引入新更改的任何提交。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch -rf dir1 dir2 dirN file1 file2 fileN' --prune-empty -f HEAD

之后,如果要恢復磁盤空間,則需要刪除過濾分支保存的所有原始引用,使reflog過期,以及垃圾回收。

您可以使用git filter-branch將操作應用於您在分支中進行的所有提交。 這包括在重寫整個歷史記錄時從每個提交中刪除文件。 這里有一個很好的描述和說明: http//gitready.com/beginner/2009/03/06/ignoring-doesnt-remove-a-file.html 您可能會發現以下問題也很有用: 在GitHub上完全刪除Git倉庫和遠程文件 (這是我找到鏈接的地方)。 您將使用此解決方案運行的實際命令將類似於git filter-branch --index-filter 'git rm --cached -rf subtree–folder1 subtree_folder2' HEAD

另一種方式,對你正在做的事情來說可能有點過分,就是采摘櫻桃。 Cherry-picking允許您以您喜歡的任何詳細程度重寫您喜歡的歷史記錄的任何部分: http://git-scm.com/docs/git-cherry-pickhttp://git-scm.com/docs/git-cherry-pick 你會想要做一些像git reset --hard <HASH of commit that introduced the subtree> ,然后是一系列的

git cherry-pick -n <following commit hashes>
git reset
git add -p
git commit

對於您之后的每次提交。 這將允許您從過去的每個提交中刪除子樹。 你可以參考部分櫻桃挑選git提交有關有效櫻桃采摘的更多信息。 完成此版本的刪除后,您將需要刪除不再屬於分支的舊提交:

git reflog expire --expire-unreachable=now --all
git gc --prune=now

其他引用的問題: 如何在git中向后移動分支? 列出並刪除沒有分支的Git提交(懸空?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM