【问题标题】:How to copy specific files from one git repo to another, preserving history如何将特定文件从一个 git repo 复制到另一个,保留历史记录
【发布时间】:2019-04-04 18:04:12
【问题描述】:

我有一个旧的私人存储库,其中包含我想放入 GitHub 中的文件,但是我只想包含某些文件,或者可能只包含具有某些文件扩展名的文件,以及它们的提交历史记录。

但是我不想在提交历史记录中包含任何排除的文件。

我想最好提供一个我想复制的文件列表的文件。

【问题讨论】:

    标签: git github repository


    【解决方案1】:

    以下是您可以解决的方法。

    1. 为新存储库创建一个新文件夹。
    2. 在新文件夹中运行 git init 以将其初始化为 git 存储库。
    3. 运行git clone -n [path to your old private git repo]。这将克隆但不会签出任何文件。您将只剩下旧私有仓库的 .git/ 文件夹。
    4. 为您想要的每个文件运行git checkout [file you want]。您可能可以在这里使用通配符(您提到了文件扩展名)。
    5. 获得所需的所有文件后,删除由 clone 命令添加的远程源,并添加一个远程命名的源,其中包含新存储库位置的路径。
    6. 推送

    【讨论】:

    • 谢谢我是否必须删除旧的仓库,有没有我可以使用的替换仓库路径?
    • 你没有删除旧的 repo,你只是删除了对它的引用。
    【解决方案2】:

    文件没有提交历史。提交历史,提交有文件。

    您要么有这些提交(因此这些文件加上所有 其他 文件),或者您没有这些提交(因此没有这些文件)。

    如果您想要一个这些文件存在的历史记录,而没有包含这些文件的提交中的任何其他文件,则必须构建一个新的历史记录 em> 只有那些文件存在。

    具体如何执行此操作取决于您。您可以进行一次提交(没有额外的历史记录——新的历史记录只是一次提交,文件保持原样)。这或多或少与Mike Faber's answer 相同。或者,您可以使用git filter-branchThe BFG 编辑存储库的克隆,生成一系列新的替换提交,其中包含您想要保留的文件,但避免您想要丢弃的文件。然后,您将获得新的虚构历史,其中仅提交了这些文件。

    请注意,这一切都对原始存储库及其提交没有影响:您正在创建一个全新的存储库,其中包含仅这些文件出现在提交中的新历史。 如何实现这个结果并不重要。出现这些文件而不是其他文件的历史记录根据定义是新的不同历史记录,因此属于新的不同存储库。

    (通常,只需文件的最新副本就足够了,在这种情况下,只需使用一种方法,通过一次提交创建存储库,保存文件的最新版本。这通常比编写花哨的过滤器分支过滤器更容易. 我没有真正使用过 BFG;也许这也使这项工作变得容易。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      相关资源
      最近更新 更多