git rebase-i HEAD~7-отображение только "noop" в Редакторе

я пытаюсь раздавить коммит, который находится в голове, в тот, который несколько назад. Когда я бегу 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 и разные refspecs для локальных и удаленных ветвей. Тот же результат для всего...

что я упустил? Спасибо за помощь!


Edit:

$ 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 commit я хочу изменить с помощью d0fd20e


по рекомендации @MarkLongair я добавил set -x to /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
[...]

я говорю, "странный выход", потому что если я запускаю 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 ответов


обновление: в конце моего ответа есть объяснение этому поведению, но я оставил здесь предложения по отладке на случай, если они кому-то понадобятся.


я не уверен, что у меня есть реальный ответ здесь, но я объясню, что происходит, насколько я понимаю. При вызове как 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, что это проблемная команда. Не могли бы вы попробовать и посмотреть, что на выходе? Если это, кажется, работает, то я подозреваю, что есть более ранняя ошибка, которая заставляет эту командную строку быть искаженной. Поскольку интерактивная ребаза реализована как сценарий оболочки, вы можете довольно легко исследовать это, отредактировав скрипт с помощью 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 ссылка.

надеюсь, это поможет.


обновление: это получается, что проблема здесь была вопрошающего 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 сообщение об использовании и пустые выходные в скрипт.

хорошая головоломка :)


этот вопрос была вызвана мой .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. Не знаю.

несмотря на это, я удалил это утверждение и: пуф! больше никаких проблем!

большое спасибо @MarkLongair за его помощь!