从巨大的 Git 存储库中删除历史记录
Remove history from huge Git repository
我目前正在尝试减少我的Git存储库[=57]的大小 =] 但遇到了很多问题。
简介
我有一个庞大而复杂的 Git 存储库,其中包含数千个提交和十多个分支。它的当前大小超过 2 GB。
我想做什么
我想清理存储库历史记录 以尽可能减小其大小。我选择了一个特殊的提交,我想将其作为我的 new root commit(称之为 <NEW_ROOT>
);我想 删除 <NEW_ROOT>
之前的每个提交并 保留 之后的所有提交。
我只想保留 master
并且可能develop
分支,任何其他分支都应该从历史记录中删除以减小大小。
在程序结束时我想将所有内容推送到远程,这样它只保持更新的master和origin(基本上它必须反映我当地的情况)。
到目前为止我尝试了什么
我经常浏览网页并找到许多解决方案,但 none 其中对我有用。特别是我想 对我来说是完美的,不幸的是我在变基 .
时遇到了很多 冲突
我也很挣扎,因为我发现的许多解决方案都提到 过时和弃用 tools/options(例如 git filter-branch
)。
你能帮我想办法吗?
非常感谢!
这听起来像是您可以通过对本地大型存储库执行 shallow clone 来实现的目标:
A shallow repository has an incomplete history some of whose commits have parents cauterized away. [...] This is sometimes useful when you are interested only in the recent history of a project even though the real history recorded in the upstream is much larger.
这个想法是将您的本地存储库浅克隆到一个新目录从您认为是新根目录的提交开始。请注意,此解决方案假定您只对在新存储库中保留 单个分支 感兴趣(例如 master
)。
您需要做的第一件事是创建一个指向现有存储库中 <NEW_ROOT>
的 parent 的分支引用:
cd your-large-repo
git branch new-root <NEW_ROOT>^
我们将使用 new-root
作为浅克隆的 截止点 点。由于我们确实想在新存储库中包含 <NEW_ROOT>
,因此我们将 cut-off 指向其父存储库。当然,<NEW_ROOT>
必须从 master
.
可达
此时,您可以继续将 local 存储库克隆到一个新目录中,指定:
- 您只对
master
分支感兴趣
- 您想排除 可从
new-root
访问的所有提交
完整的命令如下:
git clone --branch master --shallow-exclude=new-root file://C:\path\to\your-large-repo C:\path\to\your-new-repo
--shallow-exclude
选项告诉 Git 从克隆中排除导致并包括 new-root
的所有提交。
现在,如果您 cd
进入 your-new-repo
,您会发现它只包含 master
分支并且根提交是 <NEW_ROOT>
。
新存储库的 origin
将设置为 file://C:\path\to\your-large-repo
。因此,在继续之前,您必须将其替换为远程存储库的实际 URL:
git remote set-url origin https://example.com/your-large-repo.git
此时,您可以简单地强制将新历史推送到远程存储库(在consequences of force pushing上有通常的警告)。
我目前正在尝试减少我的Git存储库[=57]的大小 =] 但遇到了很多问题。
简介
我有一个庞大而复杂的 Git 存储库,其中包含数千个提交和十多个分支。它的当前大小超过 2 GB。
我想做什么
我想清理存储库历史记录 以尽可能减小其大小。我选择了一个特殊的提交,我想将其作为我的 new root commit(称之为 <NEW_ROOT>
);我想 删除 <NEW_ROOT>
之前的每个提交并 保留 之后的所有提交。
我只想保留 master
并且可能develop
分支,任何其他分支都应该从历史记录中删除以减小大小。
在程序结束时我想将所有内容推送到远程,这样它只保持更新的master和origin(基本上它必须反映我当地的情况)。
到目前为止我尝试了什么
我经常浏览网页并找到许多解决方案,但 none 其中对我有用。特别是我想
我也很挣扎,因为我发现的许多解决方案都提到 过时和弃用 tools/options(例如 git filter-branch
)。
你能帮我想办法吗?
非常感谢!
这听起来像是您可以通过对本地大型存储库执行 shallow clone 来实现的目标:
A shallow repository has an incomplete history some of whose commits have parents cauterized away. [...] This is sometimes useful when you are interested only in the recent history of a project even though the real history recorded in the upstream is much larger.
这个想法是将您的本地存储库浅克隆到一个新目录从您认为是新根目录的提交开始。请注意,此解决方案假定您只对在新存储库中保留 单个分支 感兴趣(例如 master
)。
您需要做的第一件事是创建一个指向现有存储库中 <NEW_ROOT>
的 parent 的分支引用:
cd your-large-repo
git branch new-root <NEW_ROOT>^
我们将使用 new-root
作为浅克隆的 截止点 点。由于我们确实想在新存储库中包含 <NEW_ROOT>
,因此我们将 cut-off 指向其父存储库。当然,<NEW_ROOT>
必须从 master
.
此时,您可以继续将 local 存储库克隆到一个新目录中,指定:
- 您只对
master
分支感兴趣 - 您想排除 可从
new-root
访问的所有提交
完整的命令如下:
git clone --branch master --shallow-exclude=new-root file://C:\path\to\your-large-repo C:\path\to\your-new-repo
--shallow-exclude
选项告诉 Git 从克隆中排除导致并包括 new-root
的所有提交。
现在,如果您 cd
进入 your-new-repo
,您会发现它只包含 master
分支并且根提交是 <NEW_ROOT>
。
新存储库的 origin
将设置为 file://C:\path\to\your-large-repo
。因此,在继续之前,您必须将其替换为远程存储库的实际 URL:
git remote set-url origin https://example.com/your-large-repo.git
此时,您可以简单地强制将新历史推送到远程存储库(在consequences of force pushing上有通常的警告)。