2009-02-22 116 views
13

看来我最初的提交已经占用了90%的空间,因为它意外地获得了很多媒体文件。有没有办法从本地和远程回购中删除第一次提交,或者我应该保留这个吗?我可以从Git仓库中删除最初的提交吗?

+1

还有`git rebase --root`。请参阅以下SO答案的详细信息:http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git – MKroehnert 2013-06-03 13:20:51

回答

20

听起来好像您已经与其他许多用户共享存储库。如果是这种情况,那么你应该可以忍受它。

如果您控制了所有克隆,那么您可以在修改的根提交之上重新编写历史记录,并删除意外的文件。请注意,如果其他开发人员已经完成了此分支的工作,则不应该这样做。

如果您正在重写历史记录,那么您可以尝试以下操作。请注意,因为git会在日志中记录HEAD提交最近的日志(reflogs),所以即使您尝试使用git gcgit gc --prune,大型对象也不会立即从您的存储库或其他已存有它们的存储库中消失。但是,它将确保任何新的克隆都不会将大型对象作为主分支历史记录的一部分。

假设你的工作目录是“干净”:

# Go back the initial commit 
git checkout <SHA1_of_old_root> 

# Clean up the index to remove unwanted files, e.g. using git rm <files> 
# ... 

# Amend the initial commit with the new tree. Note the sha1 of the new commit 
git commit --amend 

# Go back to the master branch 
git checkout master 

# Re-apply all the commits onto the new root 
git rebase --onto <SHA1_of_new_root> <SHA1_of_old_root> 
2

或者您可以使用git filter-branch删除有问题的文件(见示例部分),但它也改写历史。因此,任何基于他/她的代码在你的旧历史之上的人都会得到不好的惊喜......

+1

过滤分支也将应付更好(或至少需要更少的交互)如果自根提交以来,对不需要的文件进行了更改跟踪。 – 2009-02-23 07:42:55