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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将分支内容移动到另一个存储库保留历史记录并避免复制原始存储库的完整历史记录?相关的知识,希望对你有一定的参考价值。

我正在尝试将一些文件移动到一个单独的存储库,保存其更改的历史记录并尝试节省磁盘空间,因为原始存储库超过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的主分支,因此需要几KB,
  3. 在repo1中创建一个新分支,
  4. 结帐回到repo1的主分支,
  5. 将几个大文件添加到repo1并将它们提交给repo1的主服务器。所以现在repo1包含2个分支 - 带有大文件和文本文件的主分支以及仅带有文本文件的步骤#3中的第二个分支,
  6. 尝试将步骤#3中的第二个分支从第一个存储库推送到第二个存储库,保留其更改的历史记录(命令在上面),
  7. 我希望在此操作之后,第二个存储库的大小将与步骤#3中的KB相同,但实际上它与第一个存储库的大小相同。
答案

你提到“几个大文件(例如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在存储库中启用LFS
  3. 告诉Git要存储在LFS中的文件,例如:通过运行git lfs track '*.mp3'
  4. 添加生成的.gitattributes文件并提交
  5. 删除并重新添加MP3: git rm --cached *.mp3 git add *.mp3 git commit -m 'Move MP3s to Git LFS'
  6. 如果你想“缩小”旧的提交,你还必须使用filter-branch重写历史记录

This guide可能完全值得一读。

以上是关于如何将分支内容移动到另一个存储库保留历史记录并避免复制原始存储库的完整历史记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一些文件从一个 git repo 移动到另一个(不是克隆),保留历史记录

将Git存储库内容移动到保留历史记录的另一个存储库

如何将代码从新的本地文件夹推送到现有 Github 存储库的主分支并保留提交历史记录?

sh 将git存储库及其所有分支,标记移动到新的远程存储库,保留提交历史记录

如何在 Subversion 存储库之间复制保留属性但不保留历史记录

如何将文件从一个文件夹移动到同一git存储库中的另一个文件夹保留历史记录[重复]