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

时间:2019-04-04 18:04:13

标签: git github repository

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

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

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

2 个答案:

答案 0 :(得分: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命令添加的远程源,然后添加一个远程命名源以及路径到新存储库位置的路径。

答案 1 :(得分:1)

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

您要么拥有那些提交(以及那些文件加上所有 other 文件),要么您没有那些提交(因此也没有那些文件)。

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

具体如何操作取决于您自己。您可以进行一次提交(没有其他历史记录-新的历史记录只是一次提交,并按原样保留文件)。 Mike Faber's answer或多或少会带来什么。或者,您可以使用git filter-branchThe BFG编辑存储库的克隆,产生一系列新的替换提交,这些提交包含要保留的文件,但要避免丢弃这些文件。然后,您将拥有新的伪造历史记录,其中仅提交了那些文件。

请注意,所有这些操作均对原始存储库及其提交没有任何影响:您正在使用一个新的历史记录来构成一个全新的存储库,在新的历史记录中,只有那些文件才出现在提交中。您如何获得此结果并不重要。根据定义,这些文件而不是其他文件出现的历史记录是新的历史记录,因此属于新的不同的存储库。

(通常,仅使用文件的最新副本就足够了,在这种情况下,只需使用一种使一次提交的存储库保存文件的最新版本的方法即可。通常比编写奇特的过滤器-分支过滤器要容易我实际上没有使用过BFG;也许这也使这项工作变得容易。)