这个问题是关于重写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
这将删除子文件夹中的所有文件。
有人可以告诉我如何修改它,以便它只删除文件夹中应用的更改?非常感谢
答案 0 :(得分:4)
使用filter-branch
运行git rm --cached
告诉git删除目录并暂存删除!它只做你告诉它做的事。
gc
和prune
) 您希望从索引中使用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参数以递归方式删除该文件夹或子文件夹中的所有文件。