如何将分支内容移动到另一个存储库中以保留历史记录,并避免复制原始存储库的完整历史记录?

时间:2019-04-14 09:27:14

标签: git

我试图将某些文件移动到单独的存储库中,以保存其更改历史记录,并尝试节省磁盘空间,因为原始存储库超过5 GB但与新存储库相关的文件占用了<50 MB。

因此,我将所有需要移动到新存储库的文件移到了一个单独的分支中,创建了一个新存储库。使用以下git命令,我可以保留历史记录,但是新的存储库占用了与原始存储库相同的磁盘空间:

git remote add originalreporemote **path**
git fetch originalreporemote 
git merge originalreporemote/branchwithfilestomove --allow-unrelated-histories
git remote rm originalreporemote

查看新的存储库大小,我发现它的大小与原始存储库的大小相同。这对我来说是多余的,因为将来没有任何情况需要我在新仓库中引用原始仓库的完整历史记录。

我移到新存储库的文件的历史记录应该占用更少的空间。

UPD

我了解可能很难理解该问题,因此您可以按照以下步骤重现该问题:

让我添加一些步骤,使您可以轻松重现该问题:

  1. 创建两个存储库,
  2. 将文本文件提交到repo1的master分支,这样将需要几个KB
  3. 在repo1中创建一个新分支,
  4. 签出回repo1的主分支,
  5. 向repo1添加几个大文件,并将它们提交给repo1的主文件。因此,现在repo1包含2个分支-包含大型文件和文本文件的master分支,以及第3步中仅包含文本文件的第二个分支,
  6. 尝试将步骤3中的第二个分支从第一个存储库推送到第二个存储库,以保留其更改历史记录(上面的命令),
  7. 我希望在此操作之后,第二个存储库的大小将与步骤3中的KB相同,但实际上它与第一个存储库的大小相同。

1 个答案:

答案 0 :(得分:0)

您提到的“几个大文件(例如,mp3文件)”使我认为您应该使用Git LFS,尽管您似乎今天没有这样做。这样一来,您就可以保留完整的Git历史记录,同时在Git之外存储较大的Blob,从而减小存储库大小:

  

Git大文件存储(LFS)在Git内部用文本指针替换了大文件,例如音频样本,视频,数据集和图形,同时将文件内容存储在GitHub.com或GitHub Enterprise等远程服务器上。

我认为这是一种更清洁的解决方案,并且受到GitHub,GitLab和Bitbucket的云产品以及GitHub Enterprise和自托管的GitLab的支持,或者您可以set it up yourself

简而言之,要转换现有存储库:

  1. 为您的操作系统安装Git LFS客户端
  2. 使用git lfs install
  3. 在存储库中启用LFS
  4. 告诉Git要在LFS中存储哪些文件,例如通过运行git lfs track '*.mp3'
  5. 添加生成的.gitattributes文件并提交
  6. 删除并重新添加您的MP3:

    git rm --cached *.mp3
    git add *.mp3
    git commit -m 'Move MP3s to Git LFS'
    
  7. 如果您要“缩小”较早的提交,还必须使用filter-branch重写历史记录

This guide可能值得全部阅读。