Как получить COMMIT EDITMSG, чтобы открыть из правильного места?

Я новичок в GIT. Я загрузил GIT для Windows из ссылки GitHub несколько дней назад. Я использую инструмент командной строки MinGW32. Мне не нравится редактор по умолчанию, поэтому я пытаюсь настроить свой любимый редактор.

я следовал инструкциям здесь использовать EditPad Pro как мой редактор. Но я продолжаю получать следующее сообщение:

Aborting commit due to empty commit message.

EditPad Pro открывает новый экземпляр. MinGW32 ждет потому что я не получаю сообщение об отмене, пока не закрою EditPad Pro. Когда редактор открывается, он открывается с пустым файлом под названием COMMIT_EDITMSG. Когда я закрываю редактор, файл сохраняется в главном каталоге для РЕПО.

я нашел ключ в ответ, конкретно эта фраза:

[Vim] сохраняет файл .git / COMMIT_EDITMSG по умолчанию

если я делаю Сохранить Как чтобы сохранить файл в .каталог git прежде чем закрыть редактор, он работает. Однако, есть две проблемы с этим:

  1. я должен помнить, чтобы Сохранить Как
  2. я не получаю полезные комментарии, которые Git добавляет по умолчанию в COMMIT_EDITMSG

текущая настройка конфигурации для core.editor - это:

"'D:Program FilesJGsoftEditPadPro5EditPad Pro.exe' //newinstance"

Я не уверен, что $* упомянутый в инструкциях для, но я попробовал его с и без этого, а также различные варианты с и без одинарных / двойных кавычек. Я также попытался установить значение в скрипте оболочки. В худшем случае он вообще не работает (например, даже не открывает редактор), и в лучшем случае он открывает пустой файл.

Как открыть мой редактор с файлом, который git создал в.в Git?

EDIT: я получаю те же самые результаты, использую ли я $* или нет, и ответ говорит, что это не нужно. этой Git Pro страница упоминает об этом при объяснении того, как настроить внешние инструменты слияния и различия, но не упоминает об этом при объяснении core.editor конфигурации. Примечание: Я также пробовал %*.

если $* переменная была необходима (и отсутствует), я бы подумал, что EditPad Pro откроется с пустым без названия файл, а не пустой файл COMMIT_EDITMSG в текущем каталоге. Проблема, похоже, в пути.

EDIT: Я больше экспериментировал. У меня есть пробелы в пути к файлу, и я подумал, что это может вызвать проблему. Я клонировал свое РЕПО в новый каталог без пробелов в имени и исправил свои переменные конфигурации. Это не решило проблему. Но я заметил еще одну проблему. В некоторых моих тестах пустой файл, загруженный в Редактор, назывался $@.

5 ответов


есть несколько вопросов, которые могут вызвать путаницу и проблемы.

  1. Специальная Переменная Оболочки

    если core.editor установлен до редактор путь и имя файла, затем $* переменная избыточна и не нужны. Однако, если core.editor установлен скрипт, то $* переменная должна быть передана редактору.

    это действительно:

    $ git config --global core.editor "'D:/Path To/EditPadPro.exe' //newinstance"
    

    это тоже действует:

    $ git config --global core.editor "'E:/Path To/editor.sh'"
    

    когда editor.sh содержит:

    #!/bin/sh
    "D:/Path To/EditPadPro.exe" //newinstance "$*"
    
  2. пробелы в именах файлов

    имена файлов с пробелами могут быть болью. Если путь / имя файла указано, то обычно это не проблема. Но при установке значения core.editor вы должны либо

    побег пространства, как это:

    "E:/Path\ To/editor.sh"
    

    или процитируйте его дважды, как это:

    "'E:/Path To/editor.sh'"
    

    без дополнительных кавычек (или обратных косых черточек) у вас не будет проблем с установкой значения, но он не будет работать, когда он используется, потому что внешние кавычки не являются частью значения.

    EDIT: последний метод (цитирование дважды) кажется более безопасным. См. редактирование внизу для получения дополнительных объяснений.

  3. Разделитель Путей Windows

    имя файла, которое передается в Редактор, может быть относительным путем (т. е.git / COMMIT_EDITMSG) или абсолютный путь (т. е. e:/path к/.git/rebase-merge / git-rebase-todo), но в обоих случаях он использует косые черты в качестве разделителя пути. Windows обычно может принимать косые черты в качестве разделителя пути, особенно если путь указан в кавычках. Возможно,более старая версия EditPad Pro не удается принять косые черты в сочетании со скрытым каталогом. Немного предварительной обработки может исправить этот.

    Примечание: жестко закодированные пути с прямыми косыми чертами и нет скрытый каталог, похоже, работает нормально. Жестко закодированные пути со скрытыми каталогами и обратные косые черты, похоже, работают нормально.

Окончательное Решение

я не очень опытен в написании сценариев оболочки, но теперь для меня работает следующее.

editor.sh файл содержит:

#!/bin/sh
fullpath=`echo "$*" | tr '/' '\\'`
"D:/Program Files/JGsoft/EditPadPro5/EditPadPro.exe" //newinstance "$fullpath"

и конфигурация установлена вот так:

$ git config --global core.editor "'E:/Path To/editor.sh'"

моя копия EditPad Pro 5.3.2 теперь открывается с правильными файлами, уже загруженными, независимо от того, какая команда git запускает редактор.

EDIT: мне пришлось изменить значение core.editor. Я использовал обратные косые черты, чтобы избежать пробелов в пути, и это правильно открыло редактор. Однако, когда команда GIt передала имя поля с относительным путем (начиная с точки) в мой сценарий оболочки, значение $* был $@ вместо имени файла, который заставил редактор открыть пустой файл с именем $@. Я думал, что проверил эту комбинацию, но, видимо, нет. С помощью цитата дважды метод работает.


$* для "всех других параметров": см."что значит $* значит в shell-скрипт"

если вы забыли $* in:

 "C:/Program Files/JGsoft/EditPadPro6/EditPadPro.exe" //newinstance "$*"

, вы не откроете свой редактор с конечным параметром, который является .git/COMMIT_EDITMSG.
это означает, что вы не экономите, за единицу свое сообщение, где он должен быть сохранен (для Git, чтобы использовать его).


Я не уверен, что проблема заключается в EditPad Pro или MinGW32, но я нашел обходной путь. Если я передаю путь и имя файла, он работает.

например:

$ git config --global core.editor "'D:/Program Files/JGsoft/EditPadPro5/EditPadPro.exe' //newinstance '.git\COMMIT_EDITMSG'"

EditPad Pro откроется с двумя файлами: пустой COMMIT_EDITMSG в текущем каталоге и COMMIT_EDITMSG из.каталог git. Я могу редактировать .git один и сохранить его. Когда я закрываю редактор .ГИТ используется в качестве сообщения фиксации. Пустой нигде не сохраняется и полностью игнорируется.

обратная косая черта и одинарные кавычки в '.git\COMMIT_EDITMSG' важны. Иначе и быть не может. Сначала я подумал, что, возможно, моей старой версии EditPad Pro не понравились косые черты, но я могу передать другие имена файлов, используя косые черты в пути (с кавычками или без них), и это работает для них. Я могу только предположить, что любой другой вариант COMMIT_EDITMSG противоречит тому, что MinGW32 уже передает.

Так как путь относительно текущего каталога он должен работать независимо от того, какое РЕПО я совершаю.

EDIT: вышеуказанное решение будет работать только для коммитов.

это не помогает, когда редактор используется для других целей, таких как интерактивная перебазировка. См.мой другой ответ для окончательного решения.


следующие работы для меня до сих пор совершает:

$ git config --global core.editor "'C:/Program Files/Just Great Software/EditPad Pro 7/EditPadPro7.exe' '//wait'" --replace-all

откроется новая вкладка, указывающая на правильный файл, и ожидает закрытия этой вкладки перед продолжением. The --replace-all был добавлен, чтобы очистить материал, который я застрял там от предыдущих попыток установить его.


решение в выбранном ответе было очень полезно.

Я хочу поделиться однострочной версией на его основе:

git config --global core.editor "callEditor(){ filepath=\`echo \"$*\" | tr '/' '\' 2> /dev/null\`; '**PathToYourEditorHere**' \"$filepath\"; }; callEditor"