псевдоним git с необязательным параметром - PullRequest
7 голосов
/ 08 июля 2011

Я хочу убедиться, что моя последняя фиксация имеет текущую дату, прежде чем я нажму.Так как я всегда делаю ребаз до master перед объединением + push, я сделал этот псевдоним:

[alias]
    sync = !git commit --amend --date=today && git rebase master

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

git sync 'my commit message'

или

git sync

, где последний будет просто использовать существующее сообщение фиксации, независимо от того,это случилось?

Ответы [ 2 ]

12 голосов
/ 09 июля 2011

Чтобы применить дополнительные параметры ко всему, кроме конца «командной строки» вашего псевдонима, вам нужно поместить команды оболочки в скрипт.Вы можете сделать это с помощью внешнего скрипта (например, ответ jdelStrother ), или вы можете сделать это с помощью встроенного скрипта оболочки.

Вы можете использовать -m для подачи git commitваше новое сообщение или используйте параметр -C HEAD / --reuse-message=HEAD, чтобы оно использовало существующее сообщение и автора (оно также будет повторно использовать метку времени автора, но вы сбрасываете ее с помощью --date=…).Использование любого из этих параметров не позволит Git открыть редактор для вашего сообщения о коммите.

Вот он как «встроенный» скрипт оболочки:

git config --global alias.sync '!sh -c '\''git commit --amend --date=today ${1+-m} "${1---reuse-message=HEAD}" && git rebase master'\'' -'

Ядро этого маленького скриптапара расширений условных параметров:

${1+-m} "${1---reuse-message=HEAD}"

Когда вы вызываете его с дополнительным параметром (то есть вашим сообщением в журнале замены), они расширяются до двух слов оболочки: -m "<your new log message>".Когда вы не задаете дополнительный параметр, они расширяются до одного слова: "--reuse-message=HEAD".

Также важен завершающий тире;это может быть любое слово оболочки, дело в том, что что-то должно быть там, потому что оболочка будет использовать его для инициализации своего параметра $0 (который обычно имеет значение по умолчанию, поэтому он бесполезен для самого условного расширения).


Если я неправильно понял, и вы действительно хотите увидеть редактор, если вы не указали дополнительный параметр, тогда используйте одно расширение ${1+-m "$1"} вместо пары расширений.

6 голосов
/ 08 июля 2011

Когда ваши псевдонимы становятся более сложными, возможно, проще всего создать отдельный сценарий для них. Если вы добавите файл 'git-sync' в свой путь, он будет автоматически вызываться при выполнении 'git sync'.

Итак, если вы создали этот файл с чем-то вроде -

#!/bin/sh

if [ -z "$1" ]; then
  git commit --amend --date=today
else
  git commit --amend --date=today -m "$1"
fi
git rebase master

- это, вероятно, сработает. Это напечатано на макушке моей головы, так что будьте осторожны, лектор.

...