3

这个问题是关于重写 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

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

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

4

2 回答 2

4

运行filter-branchwithgit 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
于 2012-06-27T14:15:57.760 回答
0

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

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

于 2013-05-08T21:22:34.847 回答