我想从我们的git存储库中删除一些大文件,这样其他人就可以从存储库拉取而不必下载它们。
我已经尝试忽略这些文件,并且还尝试从推送它们的主机上删除/提交/推送它们,但都没有成功。
我可以访问服务器和裸存储库。
谢谢!
我已经尝试忽略这些文件,并且还尝试从推送它们的主机上删除/提交/推送它们,但都没有成功。
我可以访问服务器和裸存储库。
谢谢!
git filter-branch是你在这里的答案。
从裸仓库中,你有几个选择。
1)你想从每个提交中删除一个或多个文件。
$ git filter-branch --index-filter \
'git rm --cached --ignore-unmatch junk/bigfile' -- --all
或者
$ git filter-branch --index-filter \
'git rm --cached --ignore-unmatch -r junk/' -- --all
2) 你想要查找一个文件,无论它在哪个路径下,并删除其所有存在的历史记录。
$ git filter-branch --index-filter \
'mv $GIT_INDEX_FILE /tmp/index;
GIT_INDEX_FILE=/tmp/index git ls-files -s|
grep -v FILENAME|git update-index --index-info' -- --all
3) 您想找到一个特定的提交文件,并只删除该文件。例如,如果您提交了一个大的二进制文件,然后用较小的文件替换该文件,您需要找到包含原始大文件的blob,并将其清除。
$ git ls-tree -r <commit> | grep SOMEFILE
100644 blob 4cbedad5b4ab88f700bf27ae5a32bdb3627fa632 SOMEFILE
$ git filter-branch --index-filter \
'mv $GIT_INDEX_FILE /tmp/index;
GIT_INDEX_FILE=/tmp/index git ls-files -s|
grep -v 4cbedad5b4ab88f700bf27ae5a32bdb3627fa632|
git update-index --index-info' -- --all
$ rm -rf refs/original
$ git fsck
$ git prune
$ git gc
$ git repack -a
你已经完成了。
警告:git-filter-branch将重写每个提交。确保没有未提交/未推送的工作更改。在执行此操作之前,每个人都必须提交并推送。
完成后,每个人应执行以下操作: $ git fetch --all $ git reset --hard @{upstream}
您需要使用git filter-branch
或类似技术来重写历史记录。请参考此示例以移除文件Rakefile
在GitHub帮助中心:
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch Rakefile' \
--prune-empty -- --all
请注意,已经克隆您的存储库的所有人都需要将其分支硬重置到远程分支上,否则他们会重新引入文件。
$ git clone -s bare_repo.git
$ cd bare_repo
2) 使用 git-log 命令查找提交记录
$ git log
384b1a3306c1247559563f855e2adf5ced80678b good commit
8abb0e7cf306ceb209cb5c4aa3b422b9460fdb64 bad commit
3) 使用git rebase来重写历史记录,排除那个提交
$ git rebase -i 8abb0e7cf306ceb209cb5c4aa3b422b9460fdb64^ <--- note the ^**
4)错误提交应该在顶行。删除该行,保存并退出。 5)git-log应该显示已删除错误提交的历史记录。 6)将更改推回。使用-f标志强制更新。
$ git push -f origin master
6) 您现在可以删除工作目录
还有BFG Repo-Cleaner,它比git-filter-branch快得多。但是,它不会删除分支中引用的文件。请参考Dave's answer来删除这些文件。