当前位置:  开发笔记 > 编程语言 > 正文

折叠git存储库的历史记录

如何解决《折叠git存储库的历史记录》经验,为你挑选了4个好方法。

我们有一个有着悠久历史的git项目.

具体来说,在项目的早期,项目中有相当多的二进制资源文件,这些文件现在已被删除,因为它们实际上是外部资源.

但是,由于先前提交了这些文件,我们的存储库大小> 200MB(总结账时间约为20MB).

我们想要做的是"折叠"历史记录,以便存储库看起来是从以后的版本创建的.例如

1-----2-----3-----4-----+---+---+
                   \       /
                    +-----+---+---+

    存储库已创建

    添加了大量二进制文件

    删除了大量的二进制文件

    存储库的新目标"开始"

因此,我们希望在某一点之前丢失项目历史.此时只有一个分支,因此尝试处理多个起点等没有复杂性.但是我们不希望丢失所有历史记录并使用当前版本启动新的存储库.

这是可能的,还是我们注定要永远拥有一个膨胀的存储库?



1> Paul..:

您可以删除二进制膨胀并保留历史记录的其余部分.Git允许您重新排序和"压缩"先前的提交,因此您可以只组合添加和删除大二进制文件的提交.如果添加都是在一次提交中完成,而删除则在另一次提交中完成,这将比处理每个文件容易得多.

$ git log --stat       # list all commits and commit messages 

搜索这个添加和删除二进制文件的提交,并记下它们的SHA1,比如说2bcdef3cdef3.

然后,要编辑repo的历史记录,请使用rebase -i带有交互选项的命令,从添加二进制文件的提交的父级开始.它将启动您的$ EDITOR,您将看到以下开头的提交列表2bcdef:

$ git rebase -i 2bcdef^    # generate a pick list of all commits starting with 2bcdef
# Rebasing zzzzzz onto yyyyyyy 
# 
# Commands: 
#  pick = use commit 
#  edit = use commit, but stop for amending 
#  squash = use commit, but meld into previous commit 
# 
# If you remove a line here THAT COMMIT WILL BE LOST.
#
pick 2bcdef   Add binary files and other edits
pick xxxxxx   Another change
  .
  .
pick 3cdef3   Remove binary files; link to them as external resources
  .
  .

插入 squash 3cdef3第二行并删除pick 3cdef3列表中的行.您现在有一个交互操作列表,rebase它将添加和删除二进制文件的提交组合到一个提交中,其中diff只是这些提交中的任何其他更改.然后,当您告诉它完成时,它将按顺序重新应用所有后续提交:

$ git rebase --continue

这将需要一两分钟.
你现在有一个不再拥有二进制文件的回购.但是他们仍然会占用空间,因为默认情况下,Git会在垃圾收集之前保持30天左右的变化,以便您可以改变主意.如果您想立即删除它们:

$ git reflog expire --expire=1.minute refs/heads/master
      #all deletions up to 1 minute  ago available to be garbage-collected
$ git fsck --unreachable      # lists all the blobs(files) that will be garbage-collected
$ git prune
$ git gc                      

现在你已经消除了膨胀,但保留了历史的其余部分.


你只需要记住,如果其他人已经从该存储库中撤出,重写历史将会混淆他们的拉动.git-rebase手册解释了如何恢复其他回购.http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html

2> davitenio..:

您可以使用git filter-branchgrafts将提交编号4作为分支的新根提交.只需创建.git/info/grafts一个包含提交号为4的SHA1的行中的文件.

如果你现在做一个git log或者gitk你会看到,这些命令将显示提交数4作为分支的根.但是在您的存储库中实际上没有任何改变.您可以删除.git/info/grafts和输出git loggitk将像以前一样.要实际使第4号提交新根,您必须运行git filter-branch,不带参数.



3> Pat Notz..:

感谢JesperE的帖子,我调查了git-filter-branch- 这可能实际上就是你想要的.看起来你可以保留你之前的提交,除非你的大文件被删除后它们会被修改.从git-filter-branch手册页:

假设您要从所有提交中删除文件(包含机密信息或侵犯版权):

git filter-branch --tree-filter'rm filename'HEAD

请务必阅读该手册页...显然,您希望在存储库的备用克隆上执行此操作,以确保其按预期工作.


查看github的链接... git-filter-branch命令有一些强大的选项:https://help.github.com/articles/remove-sensitive-data

4> JesperE..:

git-fast-export你在找什么?

NAME
   git-fast-export - Git data exporter

SYNOPSIS
   git-fast-export [options] | git-fast-import

DESCRIPTION
   This program dumps the given revisions in a form suitable to be piped into git-fast-
   import(1).

   You can use it as a human readable bundle replacement (see git-bundle(1)), or as a kind
   of an interactive git-filter-branch(1).

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有