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