在新的存储库中提取一系列提交

问题描述 投票:0回答:4

我想从一个存储库中删除一定范围的提交并将它们放入一个新的存储库中。 例如,我有回购“oldRepo”:

A-B-C-D-E-F-G-H-I
->“newRepo”
B-C-D-E-F

我有一个 rebase 来解决它的想法,但我陷入了一个错误(这是关于它的问题:Stackoverflow-question) 我真的找不到任何有用的东西,任何人都可以用这个特定的命令或程序帮助我吗?

git git-rebase
4个回答
0
投票

另一种方法是使用

git cherry-pick
,因为您可以cherry-pick一系列提交
git cherry-pick FIRST^..LAST
)。

转到您的新存储库本地克隆(在其主分支中至少有一个提交)并执行:

cd /path/to/new/repository
git remote add old /path/to/old/repository
git fetch old

git switch main
git cherry-pick B^..F

如果需要,您可以添加合并策略选项(例如

-Xtheirs
)。


0
投票

快速/简单的选择是使用

git replace

git init new-repo
cd new-repo
git fetch /path/to/old/repo hash-f:branchname
git replace --graft hash-b
git filter-branch -- --all
rm -rf .git/refs/original/
git gc

这会拉取历史记录以从您的旧回购中提交 F,然后删除提交 B 之前的所有内容。

请注意,这必须为您的所有提交分配新的提交 ID(就像使用

rebase
cherry-pick


0
投票

我找到了另一个解决方案,我使用 git fast-export COMMIT_ID..BRANCH 并在之后再次导入它,效果很好。

git fast-export commit_ID..BRANCH > export.txt
//switch in new Repo
git fast-import < export.txt

0
投票

这是一种方法:

  1. 检查源代码分支
  2. 切换到现有仓库中的新分支,例如
    git switch -c beautiful_history_1
  3. git rebase --interactive
    • 挤压、移除等塑造历史,使其成为所需的
  4. 确认历史和代码看起来像你想要的那样。如果不只是重复步骤 1-3.
  5. 更改目录和`git clone --single-branch --branch beautiful_history_1
    (你可能还想要 --no-tags)

克隆标志(来自 git-clone):

--无标签

不要克隆任何标签,并在配置中设置 remote..tagOpt=--no-tags ,确保以后的 git pull 和 git fetch 操作不会跟随任何标签。随后的显式标签提取仍然有效,(参见 git-fetch [1])。

可以与 --single-branch 结合使用来克隆和维护一个除了单个克隆分支之外没有引用的分支。这很有用,例如维护一些存储库的默认分支的最小克隆以进行搜索索引。

--[无-]单分支

仅克隆导致单个分支尖端的历史记录,由 --branch 选项指定或主分支远程的 HEAD 指向。进一步提取到生成的存储库中只会更新该选项用于初始克隆的分支的远程跟踪分支。如果在创建 --single-branch 克隆时远程的 HEAD 没有指向任何分支,则不会创建远程跟踪分支。

© www.soinside.com 2019 - 2024. All rights reserved.