全局删除裸Git存储库中的文件

时间:2014-03-26 00:20:52

标签: git

我想删除一些有人推入我们的git存储库的大文件,所以其他人都可以从repo中取出而不下载它们。

我已经尝试忽略这些文件,并且还从没有运气推送它们的主机中删除/提交/推送它们。

我可以访问服务器和裸仓库

谢谢!

4 个答案:

答案 0 :(得分:5)

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以恢复存储库。

如果要删除的文件导致空提交,请将'--proune-empty'选项添加到git-filter-branch命令行。这将允许git完全放弃提交。

只要refs / original包含原始头部,git就不会修剪已删除的文件或blob。

一旦您对结果完全满意,存储库本身就可以缩小

$ rm -rf refs/original
$ git fsck
$ git prune
$ git gc
$ git repack -a

你已经完成了。

  

警告:git-filter-branch将REWRITE EVERY COMMIT。确保   没有未提交/未完成的工作已更改。每个人都必须   在这之前承诺并推动。

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

答案 1 :(得分:1)

您必须使用git filter-branch或类似技术重写历史记录。请参阅此示例以删除文件Rakefile in the github help

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

您应该知道,已经克隆了您的存储库的每个人都需要将其分支硬盘重置为遥控器上的分支,或者他们会重新引入这些文件。

答案 2 :(得分:1)

如果要删除的文件是自己提交的,则可以使用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应该显示你的错误提交的历史记录。 5)推回更改。使用-f标志强制更新

$ git push -f origin master

6)您现在可以删除工作树

答案 3 :(得分:0)

还有BFG Repo-Cleaner,它比git-filter-branch快得多。但是,它不会删除分支中引用的文件。请咨询Dave's answer以删除它们。