git fast-import不起作用

时间:2015-08-16 13:08:40

标签: git git-fast-import

我只是尝试删除特定提交背后的历史记录。我在Git: how to remove history before a specific commit找到了以下命令:

git fast-export master~5..master | (cd ../newrepo.git && git init . && git fast-import && git checkout)

我刚刚为我的案例更改了命令(我需要分支ip6_dev的最后65次提交):

git fast-export ip6_dev~65..ip6_dev | (cd ../puppet/ && git init . && git fast-import && git checkout)

当我运行命令时,我得到以下输出:

---------------------------------------------------------------------
Alloc'd objects:      10000
Total objects:         7985 (       782 duplicates                  )
      blobs  :         4978 (         0 duplicates       2304 deltas of       49
25 attempts)
      trees  :         2942 (       782 duplicates        263 deltas of       29
28 attempts)
      commits:           65 (         0 duplicates          0 deltas of
 0 attempts)
      tags   :            0 (         0 duplicates          0 deltas of
 0 attempts)
Total branches:           1 (         1 loads     )
      marks:        1048576 (      5043 unique    )
      atoms:           2438
Memory total:          2997 KiB
       pools:          2606 KiB
     objects:           390 KiB
---------------------------------------------------------------------
pack_report: getpagesize()            =      65536
pack_report: core.packedGitWindowSize =   33554432
pack_report: core.packedGitLimit      =  268435456
pack_report: pack_used_ctr            =        358
pack_report: pack_mmap_calls          =         65
pack_report: pack_open_windows        =          1 /          1
pack_report: pack_mapped              =   14669749 /   14669749
---------------------------------------------------------------------

fatal: You are on a branch yet to be born

我缺少什么?

1 个答案:

答案 0 :(得分:1)

&& ...序列的最后一步是:

git checkout

请注意缺少分支名称(或特定的提交ID或路径)。然后看看the git checkout documentation(我承认这有点模糊):

  

更新工作树中的文件以匹配索引或指定树中的版本。如果没有给出路径, git checkout 也会更新HEAD以将指定的分支设置为当前分支。 [...]你可以省略< branch>,在这种情况下命令退化为“检查当前分支”......

因此,下一个要问的问题是:“当前分支的名称是什么?”通常可以运行git branch来查找,但是如果我们这样做,我们可能什么都没有(你根本不会得到任何东西,但你不会得到一个分支标记也带星号;见下文):

$ mkdir example.git
$ cd example.git
$ git init
Initialized empty Git repository in ...
$ git branch
$ 

还有一个替代的低级git命令可以给我们正确的答案:

$ git symbolic-ref --short HEAD
master
$ 

(或者我们可以欺骗并查看文件.git/HEAD)。

请注意,我此时并未实际运行git fast-import,但如果我运行git checkout时没有参数,我会收到同样的错误:

$ git checkout
fatal: You are on a branch yet to be born

唯一剩下的事情就是要指出git fast-import将按照其输入的指示导入提交(和分支),该输入来自git fast-export,您按名称指向仅从分支ip6_dev导出某些提交。因此,我可以预测,如果运行git branch,你会看到:

$ git branch
  ip_dev
$ 

这意味着您的新回购只有一个分支ip_dev您所在的分支:您在master,而不是fast-export但是存在。如果您master在分支master上编辑了一些提交,git checkout 存在,您就可以ip_dev。< / p>

如果您想只拥有一个master分支,只需明确检查,以便切换当前分支。你仍然没有{{1}},但现在git不会抱怨无法检查出来。