将git孤立分支提取到独立repo中

将git孤立分支提取到独立repo中,git,Git,我有一个git回购协议,其中有多个孤立分支,包含各自独立和不相关的历史。结构类似于 C:\repos\original-git-repo>git branch orphan1 *orphan2 orphan3 这对于我的工作流程来说是一个糟糕的结构 如何轻松地将这些孤立分支提取到独立repo中,同时(a)维护每个孤立分支的分支历史,以及(b)每个新的独立repo仅包含其匹配孤立分支中的对象,而不是原始repo中的所有对象 git回购的结果目录树如下所示 C:\repos&

我有一个git回购协议,其中有多个孤立分支,包含各自独立和不相关的历史。结构类似于

C:\repos\original-git-repo>git branch
   orphan1
  *orphan2
   orphan3
这对于我的工作流程来说是一个糟糕的结构

如何轻松地将这些孤立分支提取到独立repo中,同时(a)维护每个孤立分支的分支历史,以及(b)每个新的独立repo仅包含其匹配孤立分支中的对象,而不是原始repo中的所有对象

git回购的结果目录树如下所示

C:\repos>
   |- original-git-repo/
   |- orphan1/
   |- orphan2/
   `- orphan3/
更新:如下所述,原始repo的正常克隆会将所有对象克隆到新repo的
.git/objects
目录中,而不仅仅是特定孤立分支的对象。对于最小的新回购规模,我所能做的最好的事情就是为每个原始孤立分支提供这种过度手动的方法

$ git init [--bare] <new repo>
# push orphan branch from orig to new repo as `push.default = current` in config
$ git remote add <new repo name> <path>
$ git push <new repo name>
# manually copy relevant tags from orig repo to new repo's `.git/refs/tags` dir

这很容易。基本上,对于每个分支机构,您只需创建回购协议的副本,将所需分支机构设置为“主分支机构”,删除其他分支机构,并移除松散对象:

$ git clone <original repo> <new repo>
$ git remote rm origin  # Optionally remove reference to original repo
$ git checkout <desired branch>
$ git branch -m master
# Delete all unwanted branches
# Optionally, remove all unreachable objects:
$ git prune --expire=now
$ git gc --aggressive
$git克隆
$git remote rm origin#可选择删除对原始回购的引用
$git结帐
$git分支-m主
#删除所有不需要的分支
#(可选)删除所有无法访问的对象:
$git prune--expire=now
$git gc—攻击性

只需一个url和refname,您就可以获取任何想要的内容

git init orphan1
cd orphan1
git fetch /path/to/original orphan1:orphan1

其他的也一样。

这应该可以,但不能。使用标记克隆原始(非打包)repo会将所有对象(在我的测试用例中为684)拉入
.git/objects
并创建一个
.git/packed refs
包含所有
.git/refs/tags/*
从原始repo拉下来的标记。点击回车太早…使用标记克隆原始repo(非打包)repo会拉入所有对象(在我的测试用例中为684)放入
.git/objects
中,并创建一个
.git/packed refs
,其中包含从orig repo中下拉的所有
.git/refs/tags/*
标记。我能做的最好的事情是从orig repo中
git init[--bare]
然后
git push
(使用
push.default=current
config)。这给了我52个对象在新repo的
。git/objects
。然后我手动将我想要的标记复制到新repo的
。git/refs/tags
。这是一个更好的方法。@Jon:你运行过
git prune
git gc
吗?是的,我按照你的建议按顺序运行了gc和prune。我还认为删除后这些会清除所有未使用的对象我现在的工作原理是,因为
git clone
在新的repo中创建了一个
.git/packed refs
文件,其中包含所有标记和孤立的分支引用(例如来自orig repo的
refs/remotes/origin/orphan1
,这会导致prune/gc/fsck不会将引用的对象视为无法访问。我正在从头开始调查。使用新repo的
.git/packed refs
(从
git clone
创建)as is阻止prune删除未使用的对象。在您的配方中,如果我编辑
.git/packed refs
以仅包含与我想要的单个分支对应的标记,然后运行
git prune
git gc
,684个最初克隆的对象将被修剪为52个,并按照我们两人的预期进行打包。这非常有效没有意外的副作用。从orig repo中,它只获取所需的对象、任何相应的标签,并且不打包。我正在更新我的问题,向您的配方中添加一个简单的内容,将新repo的
orphan1
分支重命名为
master
git init orphan1
cd orphan1
git fetch /path/to/original orphan1:orphan1