从裸Git仓库全局删除文件

6
我想从我们的git存储库中删除一些大文件,这样其他人就可以从存储库拉取而不必下载它们。
我已经尝试忽略这些文件,并且还尝试从推送它们的主机上删除/提交/推送它们,但都没有成功。
我可以访问服务器和裸存储库。
谢谢!
4个回答

9

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

每次执行此操作时,当前的“refs”或分支头将备份到refs/original目录中。您可以随时将其复制回refs/heads以恢复存储库。
如果要删除的文件导致空提交,请在git-filter-branch命令行中添加“--prune-empty”选项。这将允许git完全丢弃提交。
只要refs/original包含原始头,git就不会修剪已切除的文件或blob。
一旦您对结果完全满意,存储库本身就可以缩小。
$ rm -rf refs/original
$ git fsck
$ git prune
$ git gc
$ git repack -a

你已经完成了。

警告:git-filter-branch将重写每个提交。确保没有未提交/未推送的工作更改。在执行此操作之前,每个人都必须提交并推送。

完成后,每个人应执行以下操作: $ git fetch --all $ git reset --hard @{upstream}


请注意,在具有长时间历史记录的大型存储库上,filter-branch 步骤可能需要数小时的时间。 - yoyo
这是一个针对BFG无法删除“脏”文件(即在分支中被引用的文件)的救命工具。 - Jose Quinteiro

2

您需要使用git filter-branch或类似技术来重写历史记录。请参考此示例以移除文件Rakefile 在GitHub帮助中心

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch Rakefile' \
  --prune-empty -- --all

请注意,已经克隆您的存储库的所有人都需要将其分支硬重置到远程分支上,否则他们会重新引入文件。


"--tag-name-filter cat" 是多余的。除非您打算更改标签名称,否则不要添加 tag-name-filter。 - Dave
@Dave 我直接从 Github 的帮助页面上复制的。谢谢! - TimWolla

2
如果您想删除的文件是单独提交的,可以使用rebase命令来简单地消除提交。
1) 检出一个工作副本。
$ 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) 您现在可以删除工作目录


0

还有BFG Repo-Cleaner,它比git-filter-branch快得多。但是,它不会删除分支中引用的文件。请参考Dave's answer来删除这些文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接