如何重写历史记录以删除文件夹中所做的所有更改?

时间:2012-06-27 14:03:56

标签: git

这个问题是关于重写git历史记录。六个月前,我决定对我的存储库的现有子文件夹进行更改,现在我已经改变了主意,想要撤消它以及所有相关的历史记录。注意,我希望在子文件夹之外进行更改应保持原样。

因此,具体而言,我试图从某个日期开始删除在repo的一个子文件夹中所做的所有更改的历史记录。

我希望的最终结果应该看起来在该日期之后的子文件夹中没有进行任何编辑/添加/删除。

查看Remove file from git repository (history)以及http://dalibornasevic.com/posts/2-permanently-remove-files-and-folders-from-a-git-repository的答案,我得到的最接近的是:

git filter-branch --index-filter 'git rm -r -f --cached --ignore-unmatch TheFolderToRemove' --prune-empty --all xxxxxx..HEAD 
git reset --hard
git remote rm origin
rm -r .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive
git prune

这将删除子文件夹中的所有文件。

有人可以告诉我如何修改它,以便它只删除文件夹中应用的更改?非常感谢

2 个答案:

答案 0 :(得分:4)

使用filter-branch运行git rm --cached告诉git删除目录并暂存删除!它只做你告诉它做的事。

如果你还有原始对象: (即你实际上没有运行gcprune

您希望从索引中使用git reset 取消暂存对该目录的更改,而不是删除目录本身:

$ git filter-branch --index-filter 'git reset -q xxxxxx TheFolderToRemove' \
>     --prune-empty -- --all xxxxxx..HEAD

其中xxxxxx是您希望文件夹所在的状态的提交。

如果您还没有原始对象: (即您从存储库中删除了旧树)

检查文件夹显示为已移除的提交(我相信它应该是xxxxxx之后的提交),撤消删除,修改提交,并在顶部修改其余历史记录:

$ git checkout -b temp <commit_after_xxxxxx>
$ git checkout HEAD^ <removed_folder>
$ git commit --amend
[temp abcdef1] <message>

然后,如果master是您唯一的分支:

$ git rebase --preserve-merges temp master

答案 1 :(得分:0)

git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatched somefolder/somefolder' --prune-empty --tag-name-filter cat -- --all

-rf参数以递归方式删除该文件夹或子文件夹中的所有文件。