我有一个包含多个孤立分支的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 init
或git 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
答案 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