压缩主分支历史记录,但保留所有先前的提交消息?

Sha*_*awn 0 git

我一直在研究git squash,但不确定它是否适用于我想做的事情.我只知道git的基础知识,所以这可能是一个荒谬的事情.

我有一个主分支,可以让10,000个提交.让我们假设它看起来像这样:

1-2-3...5000...9999-10000
Run Code Online (Sandbox Code Playgroud)

让我们假设回购中的所有文件都在某些时间点被修改过.例如,"test.php"文件已提交1,2,3,2500,6000.

现在我想做的是让master分支的整个历史记录从commit 5000开始,但保持提交日志完好无损?这甚至可能吗?

例如在"test.php"上使用blame:

<commit 1> | echo 'hello world';
<commit 2> | echo 'another line in the file';
<commit 6000> | echo 'sometime later';
Run Code Online (Sandbox Code Playgroud)

我想到为什么我想这样做很简单.在这一点上,我永远不会回滚提交5000以外的代码,但是看看谁做了改变会很棒.它还将减少结账的大小,此时非常大.

Sve*_*ach 5

Git从提交历史记录中获取源文件中的行注释时显示的信息.因此,如果您删除了部分提交历史记录,那么该信息将无法再用于git.

仅仅因为你不想在某些提交之前回滚并不是放弃历史的理由.保留它的原因还有很多,git annotate仅仅是其中之一.

因此,您尝试解决的唯一问题似乎是克隆时需要传输的数据量.您可以使用--depth选项git clone来创建浅克隆来减少这种情况.这样,历史记录仍然可以在某些遥控器中使用,但您可以自己选择要复制到克隆的历史记录的数量.

浅层克隆也是通过压缩历史来确定可以节省多少空间的好方法.请注意,--depth以两种不同的方式节省空间:它仅克隆HEAD远程当前指向的单个分支,并且克隆仅分支到某个深度.您可以使用--no-single-branch附加选项来获得更多可比较的数字,以判断是否值得压缩历史记录.大多数情况下,事实并非如此.

要测试--depth本地效果,你可以这样做

git clone --no-local --no-hardlinks --no-single-branch --depth 100 path/to/repository path/to/clone
Run Code Online (Sandbox Code Playgroud)

这将创建本地存储库的浅层克隆,同时覆盖通常的本地优化.然后,您可以使用比较总空间消耗

du -sm path/to/repository
du -sm path/to/clone
Run Code Online (Sandbox Code Playgroud)