从现有的本地分支创建一个新的Git存储库

8

我有一个Git代码库,其中包含两个分支:masterredesignredesign分支是从master创建的,并且自那时以来master没有被修改过:

master
...|--m50--\
            \--m51--|--m52--|--m53-- redesign

redesign 分支已经发展到了一个新的阶段,我希望能够创建一个全新的仓库,以 redesign 分支的首次提交作为全新仓库的初始提交,并且忘记继承自 master 的历史记录:

master
...|--m50--

redesign
--r1--|--r2--|--r3--

这在Git中可行吗?相关问题与此类似,但其目标是使用目录,而非分支。 谢谢!
4个回答

9
您可以:
  • 检出您想要用作新仓库“根目录”的提交
  • 复制所有文件到您的新目录中(除了 .git 目录)
  • 检出您的 redesign 分支
  • git format-patch master..redesign
  • 将所有生成的补丁文件移动到某个方便的位置
然后转到您的新目录:
$ git init
$ git add .           # make sure your .gitignore is in place though
$ git commit -m"..."
$ git am /path/to/patches/*.patch

执行 git am ... 时出现多个错误消息,如 /Users/elitalon/Sites/exigo/.git/rebase-apply/patch:447: trailing whitespaceerror: cake/console/cake.bat: patch does not apply。这是怎么回事? - elitalon
使用一个单独的目录来存储仅由 git format-patch 生成的补丁文件。你试图应用的内容似乎不是你应该应用的任何东西。 - Mat
算了吧。我使用了 --whitespace=fix 标志,一切都像魔法般地正常工作了。谢谢! - elitalon

1

首先,复制或克隆您的git存储库。

然后,找出您的新根提交的哈希值(在您的图表中为m51)。将其提交哈希值放入文件.git/info/grafts中,然后运行git filter-branch --all。在您验证成功操作之后,可以删除original/*备份引用(或重新克隆存储库)。

请注意,这将为所有提交创建新的提交哈希值,因此您必须小心处理已发布的历史记录。


1
创建您的新存储库,然后:
$ git add remote newrepo <path to newrepo>
$ git checkout redesign
$ git checkout --orphan clean
# The branch is empty, but the files from the original branch are staged for commit.
$ git commit -m"clean"
$ git push newrepo clean:master

注意:如果您想保留历史记录(或不关心),请省略“clean”的创建。

这是一个非常简单,直接的解决方案;我根本没有想过,回顾起来完全显而易见(大多数简单聪明的事情都是如此)。谢谢你(9年后依然感激)。我只想补充一点,关于保留历史记录的部分,这个答案并没有涉及原始问题中“从特定提交开始”的部分,因为这种保留历史记录的变体实际上会复制从一开始的所有节点。不过,之后通过交互式 rebase 来压缩提交即可解决 :) - Tasos Papastylianou

0

我的方法有点不同。我在我的Ubuntu Linux机器上测试了这个方法。步骤如下:

  1. 检出您想要克隆或创建根仓库的分支/哈希值

    $ git checkout redesign
    
  2. 通过以下命令为当前分支创建 git 存档文件

    $ git archive HEAD --format zip -o redesign-repository.zip
    

    上述命令将在当前仓库中创建一个名为 redesign-repository.zip 的新文件,并以 zip 格式存档。我们也可以将 HEAD 更改为提交的名称 / 哈希值,例如: git archive redesign --format zip -o redesign-repository.zip

  3. 新建一个目录,用于提取文件

    $ mkdir ../redesign-repo
    
  4. 将存档文件提取到该目录

    $ unzip redesign-repository.zip -d ../redesign-repo
    
  5. 切换到新的仓库并使用 git init 初始化新仓库

    $ cd ../redesign-repo
    $ git init .
    

这种方法需要依赖于zip/unzip命令的可用性。我不确定它是否在每台机器上都可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接