将git orphan分支提取到独立的repos中

时间:2014-12-15 21:58:29

标签: git

我有一个包含多个孤立分支的git仓库,其中包含各自独立且无关的历史记录。结构类似于

C:\repos\original-git-repo>git branch
   orphan1
  *orphan2
   orphan3

这对我的工作流程来说是一个糟糕的结构。

如何(a)维护每个孤儿的分支历史记录,以及(b)每个新的独立仓库仅包含来自其匹配的孤儿分支的对象,而不是原始的所有对象,如何轻松地将每个孤立分支提取到独立的回购中回购?

git repos的结果目录树看起来像

C:\repos>
   |- original-git-repo/
   |- orphan1/
   |- orphan2/
   `- orphan3/

UPDATE:如下所述,原始仓库的正常克隆似乎将所有对象克隆到新仓库的.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

使用--local --no-hardlinks --branch orphan1 --single-branch进行克隆似乎也将所有orig repo对象克隆到新的repo中,即使只克隆了一个本地/远程分支对。

UPDATE2 - 首选解决方案:如下面的两个答案所示,可以通过git initgit clone以及.git/packed-refs的一些手动编辑以多种方式解决此问题}。我根据下面接受的答案使用这个食谱。

git init orphan1
cd orphan1
git fetch C:/repos/original-git-repo orphan1:orphan1
git checkout orphan1
git branch -m master

2 个答案:

答案 0 :(得分:2)

您只需使用网址和refname

即可获取所需内容
git init orphan1
cd orphan1
git fetch /path/to/original orphan1:orphan1

和其他人一样。

答案 1 :(得分:1)

这很简单。基本上,对于每个分支,您只需创建一个repo的副本,将所需的分支设置为“master”,删除其他分支,并删除松散的对象:

$ 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