git rebase -i HEAD ~ 7 - в редакторе отображается только «noop» - PullRequest
10 голосов
/ 21 августа 2011

Я пытаюсь раздавить коммит, который находится в ГОЛОВЕ, в коммит, который несколько назад.Однако, когда я запускаю 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 для локальной и удаленной веток.Тот же результат для всего ...

Чего мне не хватает?Спасибо за вашу помощь!


Редактировать:

$ 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
[...]

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

12 голосов
/ 22 августа 2011

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


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

Обратите внимание, что это несколько отличается от того, что предлагает человекpage (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 будет интерпретироваться как single и, очевидно, неизвестный аргумент, вызывая сообщение об использовании git rev-list и пустой вывод, передаваемый всценарий.

хорошая загадка :) 1053 *

7 голосов
/ 23 августа 2011

Эта проблема была вызвана my .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 за помощь!

...