Как мне получить COMMIT_EDITMSG для открытия из правильного местоположения?

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

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

Прерывание фиксации из-за сообщения о пустой фиксации.

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

Я нашел ключ в этом ответе , в частности эту фразу:

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

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

  1. I have to remember to Save As
  2. I don't get the helpful comments that Git adds by default to COMMIT_EDITMSG

Текущий параметр конфигурации для core.editor :

"'D:\Program Files\JGsoft\EditPadPro5\EditPad Pro.exe' //newinstance"

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

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

EDIT: I get the exact same results whether I use $* or not, and this answer says it's not needed. This Git Pro page makes mention of it when explaining how to set up external merge and diff tools, but makes no mention of it when explaining the core.editor config setting. Note: I also tried %*.

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

EDIT: I've done more experimenting. I have spaces in my file path and I thought that might be causing a problem. I cloned my repo into a new directory with no spaces in the name and fixed my config variables. It didn't solve the problem. But I noticed another problem. In some of my tests, the blank file that was loaded into the editor was named [email protected].

7
Для записи /newinstance является параметром командной строки что EditPad Pro использует для запуска нового экземпляра EditPad, который приложение может ожидать . У разных редакторов есть разные способы указать это. Другими словами, этот параметр специфичен для редактора, а не Git.
добавлено автор toxalot, источник
Также обратите внимание: в этом контексте требуется двойная слэш (// newinstance). Без него EditPad Pro открывает пустой файл с именем newinstance в существующем экземпляре.
добавлено автор toxalot, источник

5 ответы

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

  1. The Shell Special Variable

    If core.editor is set to the editor path and filename, then the $* variable is redundant and not needed. However, if the core.editor is set to a shell script, then the $* variable must be passed along to the editor.

    This is valid:

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

    This is also valid:

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

    when editor.sh contains:

    #!/bin/sh
    "D:/Path To/EditPadPro.exe" //newinstance "$*"
    
  2. Spaces in File Names

    Filenames with spaces can be a pain. If the path/filename is quoted, then it isn't usually a problem. But when setting the value of core.editor you have to either

    escape the spaces like this:

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

    or quote it twice like this:

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

    Without the extra quotes (or backslash escapes), you will have no problem setting the value, but it will fail when it's used because the outer quotes are not part of the value.

    EDIT: Latter method (quoting twice) seems safer. See the edit at the bottom for more explanation.

  3. Windows Path Separator

    The filename that is being passed to the editor can be a relative path (i.e. .git/COMMIT_EDITMSG) or absolute path (i.e. e:/path to/.git/rebase-merge/git-rebase-todo), but in both cases it is using forward slashes as a path separator. Windows can usually accept forward slashes as a path separator, especially if the path is quoted. Perhaps the older version of EditPad Pro is unable to accept the forward slashes in combination with the hidden directory. A little bit of preprocessing can fix this.

    Note: Hardcoded paths with forward slashes and no hidden directory seem to work fine. Hardcoded paths with hidden directories and backslashes seem to work fine.

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

Я не очень разбираюсь в сценариях оболочки, но для меня сейчас работает следующее.

Файл 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: I had to change the value of core.editor. I had used backslashes to escape spaces in the path and this opened the editor properly. However, when a GIt command passed a fielname with a relative path (beginning with a dot) to my shell script, the value of $* was [email protected] rather than the filename, which caused the editor to open with a blank file named [email protected]. I thought I tested that combination, but apparently not. Using the quote twice method works.

5
добавлено
Отличная обратная связь, гораздо более полная, чем мой ответ. +1
добавлено автор VonC, источник
Шляпа «Git R done» ... Как специалист Git, я могу только оценить: эта шляпа подходит вам и этому вопросу. Моя шляпа к тебе, сэр.
добавлено автор VonC, источник
Благодарю. Я потратил много времени и сил на то, чтобы разобраться и написать его. Выяснить это сам по себе было удовлетворительно, но мне хорошо, что его проверяют. Что еще более важно, ваш голос заработал мне шляпу. :)
добавлено автор toxalot, источник

$* is for "all other parameters": see "what does $* mean in a shell script"

Если вы забудете $ * в:

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

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

2
добавлено

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

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

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

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

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

1
добавлено

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

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

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

0
добавлено

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

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

git config --global core.editor "callEditor(){ filepath=\`echo \"\$*\" | tr '/' '\\' 2> /dev/null\`; '**PathToYourEditorHere**' \"\$filepath\"; }; callEditor"
0
добавлено
Git — русскоговорящее сообщество
Git — русскоговорящее сообщество
588 участник(ов)

Обсуждаем git, его фичи, хаки, надстройки и экосистему. Правила: http://telegra.ph/ru-chat-rules-06-19 https://git.wtf/

pro.git::next
pro.git::next
44 участник(ов)

Обсуждение системы контроля версий git и инструментов для работы с ней.