[英]Squash master branch history but keep all prior commit messages in blame?
我一直在研究git南瓜,但是不确定它是否适用于我尝试做的事情。 我只知道git的基础,所以也许这是一件荒谬的事情。
我有一个主分支,可以说有10,000次提交。 让我们假设它看起来像这样:
1-2-3...5000...9999-10000
假设仓库中的所有文件在某些时间点已被修改。 例如,“ test.php”文件的提交值为1,2,3,2500,6000
。
现在,我要做的是使master分支的整个历史记录始于commit 5000,但保持提交日志不变? 这有可能吗?
例如,将责任归咎于“ test.php”:
<commit 1> | echo 'hello world';
<commit 2> | echo 'another line in the file';
<commit 6000> | echo 'sometime later';
我对为什么要这样做的想法很简单。 在这一点上,我将永远不会回退超过commit 5000的代码,但是很高兴看到谁进行了更改。 这也将减小结帐的大小,这在当时非常大。
当从提交历史记录注释源文件中的行时,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
这将创建本地存储库的浅表克隆,同时覆盖通常的本地优化。 然后,您可以使用
du -sm path/to/repository
du -sm path/to/clone
压缩提交将重写历史记录, 您将是做出更改的人,而您将是受到指责的人。 如果有一千个人进行了更改,而一个人决定将所有这些更改压缩为一个大更改,那么谁做了那个大更改? 压榨一切的人。 Git忘记了其他更改,因为历史被重写了。
换句话说,这是不可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.