我可以完全删除我的仓库所选子目录中所有文件的历史记录吗?

时间:2011-06-17 19:55:37

标签: git

我有testcase shell script

我有一个膨胀的存储库,称之为“oldrepo”,我正在尝试重构。存储库包含几个我不想保留的大文件目录。我希望他们完全从历史中删除。我知道如何删除特定文件using filter-branch,但我不知道如何删除特定目录或目录集的所有内容,而无需单独删除每个文件。

我以为我可以通过创建一个新的repo并且只合并我想要保留的文件来欺骗git:

mkdir newrepo
git init; touch README; git add .; git commit -m "initial"
git remote add oldrepo /path/to/oldrepo
git merge -s ours --no-commit
git read-tree --prefix=subdir1 -u
git commit -m "merged subdir1"
git remote rm oldrepo
git prune --verbose

不幸的是,prune命令没有修剪任何东西。我希望它能修剪掉从未成为SUBDIR1-TREE孩子的每一件物品。有没有办法删除目录之外的所有历史记录而不单独删除每个违规文件?

1 个答案:

答案 0 :(得分:3)

这也是filter-branch的工作,但不是像the other question中提到的那样删除选择文件/目录,而是可以使用git read-tree --empty完全清空索引(对于Git v1.7.4)或者更新;如果您运行的是旧版本的Git,请使用git read-tree不带参数),然后使用git reset恢复所需的文件/目录:

git filter-branch -f --index-filter 'git read-tree --empty && git reset -q "${GIT_COMMIT}" -- first_directory_to_keep second_directory_to_keep'