如何仅从另一个 Git 存储库中提取一个文件夹?

How do I pull just one folder from another Git repository?

我正在从一些现有的存​​储库创建一个单一存储库,我想保留提交历史记录。

This answer here 告诉我们 git subtree 命令对此很有用,如果我们想将旧的 git 存储库原封不动地导入新结构,它可以正常工作。

但是,我有一个重要的项目如下所示:

/
  server/
    index.js
    package.json
  src/
  package.json 

在这里,我只想导入 server 文件夹,并保留其上的提交历史记录。

我可以只导入整个文件夹,删除我不需要的所有内容,然后将 server 中的所有内容移到一个文件夹中,但我担心会破坏提交历史记录。

有没有办法只导入一个子目录?

正如 Serge 在评论中建议的那样 - git filter-branch 可用于实现此目的。

我是这样操作的,也许还有更简单的方法。

  1. 创建一个临时远程仓库 'temp'。

  2. 在现有的回购中:

git filter-branch --subdirectory-filter server -- --all 
git remote add temp git@temporaryrepo....
git push temp master

这将创建一个以 server 目录中的所有内容作为根的存储库。

  1. 在你的新仓库中
git subtree add -P packages/server /path/to/temp.git master

这会将临时根目录导入 packages/server