Git将特定文件夹从src repo克隆到dest repo,并保留历史记录



我有2个工作库,repo1repo2

我只想从repo1克隆几个文件夹到repo2,以及这些文件的提交历史。

的例子:

copy repo1/src/buildrepo2/src1/build

我试着克隆所有有历史的东西,但是有很多合并冲突,这是一场噩梦。因此,我希望将repo1的特定内容与其历史记录放在repo2/src1文件夹中,并保留我需要的内容。

谢谢。

要对git-filter-repo实现相同的操作,请遵循以下步骤:

本指南假设您有克隆存储库A,并且您有存储库b的文件夹。

在存储库B中,添加一个远程连接到存储库a作为分支。

git remote add repo-A-branch /path/to/example-repo-A

创建一个只包含目录1的历史记录和文件的新分支:

git filter-repo --path example-dir-1 --refs repo-A-branch --branch-name example-dir-1-branch

这将在存储库B中创建一个新的分支,其中仅包含存储库a中目录1的历史记录和文件。

将新分支合并到存储库B的主分支

git checkout master
git merge example-dir-1-branch

通过删除到存储库A的远程连接进行清理

git remote rm repo-A-branch

这个博客页面包含了你想要实现的目标。

让我引用重要的部分:

目标:将目录1从Git存储库A移动到Git存储库b。

:

  • Git repository A包含了我们不想移动的其他目录。
  • 保存我们要移动的目录的Git提交历史。

这些步骤参考下面的代码,查看完整的说明页面:

  1. 复制存储库a。这让你可以随意使用它,而不用太担心出错。
  2. 删除指向原始存储库的链接,以避免意外地进行任何远程更改(第3行)。
  3. 第四行[…]]会检查你的历史记录和文件,删除目录
  4. 中没有的任何内容。
git clone <git repository A url>
cd <git repository A directory>
git remote rm origin
git filter-branch --subdirectory-filter <directory 1> -- --all
mkdir <directory 1>
mv * <directory 1>
git add .
git commit

这些步骤参考下面的代码,查看完整的说明页面:

  1. 如果你还没有仓库B,复制一个。
  2. 在第3行,您将创建到存储库a的远程连接,作为存储库b中的分支。
  3. 从这个分支(只包含你想要移动的目录)拉入存储库b。拉复制文件和历史记录。
git clone <git repository B url>
cd <git repository B directory>
git remote add repo-A-branch <git repository A directory>
git pull repo-A-branch master --allow-unrelated-histories
git remote rm repo-A-branch

其他引用:

  • https://git-scm.com/docs/git-filter-branch
  • https://www-acc.gsi.de/wiki/Applications/AppHowToGitMoveWithHistory