【问题标题】:Git removing files from history without duplicating pre-branch commitsGit 从历史记录中删除文件而不复制分支前提交
【发布时间】:2014-11-25 08:21:33
【问题描述】:

我通常如何进行:

实际上,为了从完整历史记录中删除一些文件,我使用以下脚本(我称之为 git-crunch):

#!/bin/bash
#
# git crunch <filenames>
#
git filter-branch --index-filter "git rm --cached --ignore-unmatch $*"
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git fsck --full --unreachable
git repack -A -d
git gc --aggressive --prune=now

从(完整)历史记录中删除指定文件非常有效。

上下文是:

我有 1 个项目分为 4 个分支。这是一个摘要网络图,显示了 4 个维护分支中的 2 个:

┏ a937fd9 (1 year, 9 months ago) <new repo>
...
60 commits later, we create a branch "probe" which is displayed at left of the network
...
┣━┓
┣ ┃ c483a22 (8 months ago)
┃ ┣ f7b402c (3 months ago)
...
┃ ┣━┓
┣ ┃ ┃ 38bb93d (11 days ago)
┣ ┃ ┃ 1ef8202 (11 days ago)
┃ ┃ ┣━[remotes/origin/S...H_adjust]──adb243f (8 days ago)
┃ ┣ ┃ cd02775 (8 days ago)
┃ ┣━┛
┃ ┣ f9e40a3 (8 days ago)
┃ ┣ a30eb6f (7 days ago)
┃ ┣━[remotes/origin/S...H_verif]──4a3fe66 (7 days ago)
┃ ┗━[remotes/origin/HEAD]──[remotes/origin/master]──b452f85 (7 days ago)
┣ 91477ae (4 days ago)
┗━[HEAD]──[probe]──[remotes/origin/probe]──366c890 (48 minutes ago)

我的问题是:

我在这个存储库中有 3 个大文件,可以从一开始就删除(存储库的创建),但是如果我使用我的脚本,它只会在一个分支中运行,并且它会从头开始重新创建 4 个单独的分支,直到最后一次提交,发生在今天。

我的问题:

如何在不从一开始就分离我的分支的情况下从我的整个历史记录中删除这 3 个文件? 或者,有没有办法一次重写整个历史记录并从所有分支中删除文件,这样我就可以保持我的进化网络和“共享”提交完整(所以我的 61 个第一次提交不会重复四次)?

【问题讨论】:

标签: git git-filter-branch git-history-graph


【解决方案1】:

执行此操作的最佳工具实际上是The BFG Repo Cleaner,它是git filter-branch 的更简单、更快的替代方案。例如:

$ bfg --strip-blobs-bigger-than 10M

...删除所有大于 10MB 的 blob(不在您的 latest 提交中),并适用于您的 repo 中的 all 分支和标签。

全面披露:我是 BFG Repo-Cleaner 的作者。

【讨论】:

  • 非常感谢,拥有它,但不确定它是否会重复我对每个分支的提交...
  • 我想有一种方法可以指定文件名而不是大小?
  • 一般来说,只需在您的 repo 副本上尝试一下,看看会发生什么 - BFG 足够快,不会占用您任何时间。 BFG 运行在你的整个 repo 中,对于 all 分支 - 你不会有比你开始时更多的提交或分支。你可以指定文件名(虽然不是路径),如果你喜欢('--delete-files') - 在你的情况下有3个大文件,我只会使用'--strip-blobs-bigger-than'。
  • 事实上,在我的例子中,有 3 个无用的大文件,还有一个非常有用的 bugger 一个...为什么我需要指定文件名...谢谢!
  • 如果有用的 bugger 在你最近的提交中,BFG 不会删除它 反正:rtyley.github.io/bfg-repo-cleaner/#protected-commits
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 2016-03-13
  • 2014-11-20
  • 2015-07-24
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多