如何将特定文件从一个 git 存储库复制到另一个存储库,保留历史记录

How to copy specific files from one git repo to another, preserving history

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

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

我想最好能提供一个包含我要复制的此类文件列表的文件。

以下是您可能会采用的方法。

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

文件没有提交历史。提交 历史记录,并且提交有文件。

你要么有那些提交(因此那些文件加上所有 other 文件),要么你没有那些提交(因此没有那些文件) .

如果您想要一个历史记录,其中 这些文件存在,而没有属于保存这些文件的提交的一部分的任何其他文件,您必须 构建一个新的历史记录,其中只有那些文件存在。

具体如何操作取决于您。您可以进行一次提交(没有额外的历史记录——新的历史记录只是一次提交,文件保持原样)。这或多或少是您使用 . Or, you can use git filter-branch or The BFG 编辑存储库的克隆,生成一系列新的替换提交,其中包含您想要保留的文件,但避免了您想要丢弃的文件。然后你将拥有新的伪造历史,其中只有那些文件被提交。

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

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