自2013年8月13日起,我们有一个git存储库,提交了超过4000次,占用了近7 GB的磁盘空间。 (GIT版本:2.9.0.windows.1)
在这些年里,该项目发展很快,所以最旧的提交不再有用。
与其他许多人一样,我们希望从某个日期“巩固”历史。 假设我们想要“挤压”任何超过6个月的东西,成为一个大的提交。
主要障碍是我们有一个多分支结构,显然我们想保留它:
例如, 这就是历史现在的样子:
这就是我们所需要的:
我们尝试了几种方法,如“Rebase”,“Cherry pick”,“clone”和“deep”......但似乎没有什么能够做到我们需要的。 这些是我尝试过的最有意义的事情:
Rebase和Cherry pick(使用tortoiseGit 2.1.0.0) 使用这两个命令,我试图“压缩”最旧的提交,但每次合并都会产生一个对话框“您要选择哪个父级?parent1 / parent2”,然后无论我选择哪个:所有文件都被标记为“冲突”,所以他们需要“手动”解决。 我只是无法手动处理所有这些冲突(也没有为Master和Develop分支重现相同的相同序列)。
克隆深度(通过Git-Bash) 我执行了这个命令: “git clone limitedRepo --depth = 1000”正确“压缩”所有旧提交,但生成的repo只有一个分支。
所以我尝试了这个命令从原点返回Develop分支:
“git remote set-branches origin'*'” “git fetch -vvv”
但是获取的分支包含整个历史记录,而不是我们需要的“压扁”。
我尝试使用不同参数的相同命令,但我只是在摸索。
有什么想法吗?
答案 0 :(得分:0)
可能不是占用磁盘空间的提交数量,而是存储库历史记录中存在的大型文件的多个版本,但此后已从当前版本的代码中删除。 Pro Git有一个名为Removing Objects的部分,可让您从Git历史记录中删除大文件。
Git有很多很棒的功能,但是一个可能导致问题的功能是git clone下载项目的整个历史记录,包括每个文件的每个版本。如果整个事情都是源代码,这很好,因为Git经过高度优化,可以有效地压缩数据。但是,如果项目历史记录中的任何人添加了一个巨大的文件,那么所有时间的每个克隆都将被强制下载该大文件,即使它已从项目中删除了下次提交。因为它可以从历史中获得,所以它将永远存在。
(强调,我的)
... 请注意:此技术对您的提交历史记录具有破坏性。它会重写每个提交对象,因为您必须修改最早的树以删除大型文件引用。如果你在导入之后立即执行此操作,那么在任何人开始基于提交工作之前,你就没事了 - 否则,你必须通知所有贡献者他们必须将他们的工作重新加入你的新提交。
现在您需要做的就是find large files in your repository history。
相关StackOverflow帖子:Remove old commit information from a git repository to save space
无论你如何做到这一点,你的未来都会有一个团队git rebase
。