git rebase -i HEAD~7 - 在编辑器中只显示“noop”

时间:2011-08-21 11:29:48

标签: git version-control rebase

我正在尝试将一个位于HEAD的提交压缩成一个返回的提交。但是,当我运行git rebase -i HEAD~7时,编辑器中只显示noop!我完全不知道这应该如何运作。

我正在我创建的分支(cleanup)中工作(在我checkout -b cleanup ...中找到的SHA1上使用reflog)我获得了第一次rebase经验我不小心删除了所有这些提交;重点是,我不确定分支的父母是什么(如果重要的话,这里)。

我只是想尝试做我多次读过的内容:我想稍微修改一些不是最近提交的提交代码。当我到达那个时候,这是一个“挤压”或只是修改它的应用程序,我不知道。

我也在STDOUT上看到这个,因为编辑器在运行上面显示的rebase命令后启动:

$ git rebase -i HEAD~7
usage: git rev-list [OPTION] <commit-id>... [ -- paths... ]
  limiting output:
    --max-count=<n>
    ...

除了HEAD~7引用之外,我还尝试指定整个SHA1,并为本地和远程分支指定不同的refspec。一切都相同......

我错过了什么?谢谢你的帮助!


编辑:

$ git log --oneline HEAD~7..HEAD
d0fd20e temp Fix resume_cities table
ea2ffdf Fix db/seeds.rb to reflect recent database structure modifications
dbd2b8b Add several models/scaffolds that go along with the Geonames tables
9759091 Fix name of the ResumeSkill model file.
3fc3134 Added the SHA1 for the previous commit to the comments on the migration, to help link back to that.
bacbeb2 Consolidate database migrations! READ ME!
0c49a57 Moved back to gem versions of linkedin, omniauth, and twitter

这是我想用bacbeb2

修改的d0fd20e提交

根据@MarkLongair的建议,我将set -x添加到/usr/lib/git-core/git-rebase--interactive并看到以下奇怪的输出:

$ git rebase -i HEAD~7

[... output muted for brevity, see the full output, here: http://gist.github.com/1163118]
+ read -r shortsha1 rest
+ sed -n s/^>//p
+ git rev-list --no-merges --cherry-pick --pretty=oneline --abbrev-commit --abbrev=7 --reverse --left-right --topo-order 2c51946812a198ca908ebcad2308e4b8274624b3...d0e9ff6d9c1f8bc374856ca2a84ad52d6013b5bf
usage: git rev-list [OPTION] <commit-id>... [ -- paths... ]
  limiting output:
    --max-count=<n>
    --max-age=<epoch>
    --min-age=<epoch>
    --sparse
    --no-merges
    --remove-empty
    --all
    --branches
    --tags
    --remotes
    --stdin
    --quiet
  ordering output:
    --topo-order
    --date-order
    --reverse
  formatting output:
    --parents
    --children
    --objects | --objects-edge
    --unpacked
    --header | --pretty
    --abbrev=<n> | --no-abbrev
    --abbrev-commit
    --left-right
  special purpose:
    --bisect
    --bisect-vars
    --bisect-all
+ test t = 
+ test -s /home/ryan/Projects/social-jobs/.git/rebase-merge/git-rebase-todo
+ echo noop
[...]

我说'奇怪的输出',因为如果我直接从我的shell运行rev-list命令,它会按预期工作:

$ git rev-list --no-merges --cherry-pick --pretty=oneline --abbrev-commit --abbrev=7 --reverse --left-right --topo-order 2c51946812a198ca908ebcad2308e4b8274624b3...d0e9ff6d9c1f8bc374856ca2a84ad52d6013b5bf
>0c49a57 Moved back to gem versions of linkedin, omniauth, and twitter
>bacbeb2 Consolidate database migrations! READ ME!
>3fc3134 Added the SHA1 for the previous commit to the comments on the migration, to help link back to that.
>9759091 Fix name of the ResumeSkill model file.
>dbd2b8b Add several models/scaffolds that go along with the Geonames tables
>ea2ffdf Fix db/seeds.rb to reflect recent database structure modifications
>d0e9ff6 !temp Fix resume_cities table !temp

2 个答案:

答案 0 :(得分:12)

更新:在我的回答结尾处有这种行为的解释,但是我已经在这里留下了调试建议,以防它们对任何人都有用。


我不确定我在这里有一个真正的答案,但我会根据我的理解解释发生了什么。当调用为git rebase -i HEAD~7时,如果该文件为空或不存在,git应仅将noop输出到.git/rebase-merge/git-rebase-todo。我们知道这不是权限问题,因为该文件(包含“noop”和注释行)已成功创建。您在终端上看到来自git rev-list的错误的事实也表明问题实际上是由于调用git rev-list的方式。在git v1.7.4.1中,使用您引用的命令行,应该从以下内容中找到要包含的提交列表:

git rev-list --no-merges --cherry-pick --pretty=oneline --abbrev-commit \
    --abbrev=7 --reverse --left-right --topo-order HEAD~7...HEAD

请注意,这与手册页(git log <upstream>..HEAD)的建议略有不同,因为该范围使用...代替..

我猜,因为你看到来自git rev-list的错误,这是有问题的命令。你可以尝试一下,看看输出是什么?如果这似乎有效,那么我怀疑有一个早期错误导致此命令行格式错误。由于交互式rebase是作为shell脚本实现的,因此您可以通过使用sudo editor /usr/lib/git-core/git-rebase--interactive编辑脚本并在顶部添加set -x来轻松地对此进行调查,例如:

#!/bin/sh
set -x
#
# Copyright (c) 2006 Johannes E. Schindelin

# SHORT DESCRIPTION
[...]

然后,如果您尝试运行git rebase -i HEAD~7,您应该看到脚本正在运行的每个命令,并且可能会看到git rev-list调用的错误。

我希望能有所帮助。


更新: turns out that这里的问题是提问者IFS设置为仅包含制表符和换行符,而不是默认的空格,制表符和换行符。

这导致git-rebase--interactive开头的行中出现问题:

git rev-list $MERGES_OPTION --pretty=oneline [...]

...因为MERGES_OPTION设置为--no-merges --cherry-pick。使用默认值IFS(包括空格),将在替换变量后将其拆分为两个参数。但是,如果IFS不包含空格,则--no-merges --cherry-pick将被解释为单个,并且显然是未知的参数,导致git rev-list用法消息并在脚本中传递空输出。

一个好的谜题:))

答案 1 :(得分:7)

此问题是由我的.bashrc 设置IFS:

引起的
# remove the space character from IFS
# (http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html#IFS)
IFS="`printf '\n\t'`"

我根本不记得为什么我把它放在那里。我确定它与“修复UNIX / Linux文件名”有关,如我所包含的URL所示。不知道。

尽管如此,我删除了那句话并且:POOF! 没有问题!

非常感谢@MarkLongair的帮助!