1

我只是尝试删除特定提交背后的历史记录。我在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

我错过了什么?

4

1 回答 1

3

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

git checkout

请注意缺少分支名称(或特定的提交 ID 或路径)。然后看一下文档git checkout我承认这有点晦涩难懂):

更新工作树中的文件以匹配索引或指定树中的版本。如果没有给出路径,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,您按名称指示它仅从 branch 导出某些提交ip6_dev。因此,我可以预测,如果运行git branch,你会看到:

$ git branch
  ip_dev
$ 

这意味着您的新存储库只有一个分支 ,ip_dev不是您所在的分支:您在master,尚不存在。如果您fast-export在 branch 上编辑了一些提交mastermaster 将会存在并且您将能够做到git checkout

如果您只想拥有一个ip_dev分支,只需显式检查它,以便切换当前分支。你仍然没有master,但现在 git 不会抱怨无法检查它。

于 2015-08-16T14:06:24.320 回答