Определите псевдоним git с тем же именем для теневой оригинальной команды

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

[alias]
   rm = rm --cached
   diff = diff --color

К сожалению, это не работает. Кто-нибудь знает обходной путь? Благодарю.

Изменить настройки color.diff = true дает цветной вывод по умолчанию.

4 ответа

Решение

Для таких команд, как rm --cached которые не имеют настраиваемых параметров, лучше всего сделать псевдоним с другим именем. Например:

[alias]
        rmc = rm --cached

Возможно, вы уже поняли это, но псевдонимы Git не могут скрывать существующие команды Git. От git-config справочная страница:

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

В качестве обходного пути вы можете определить псевдонимы в Bash, чтобы получить желаемый результат. Вот что я только что подхватил для своей любимой мозоли - это "git add" не является многословным по умолчанию. (И нет никаких настроек для этого).

Поместите это в свой ~/.bash_profile или же ~/.bash_rc

function do_git {
  cmd=$1
  shift
  extra=""
  if [ "$cmd" == "add" ]; then
    extra="-v"
  elif [ "$cmd" == "rm" ]; then
    extra="--cached"
  fi
  git="$(which git)"
  ex="$git $cmd $extra $@"
  ${ex}
}
alias  git='do_git'

Тогда просто назовите это как обычно:

$ git add .
add 'foo'

Ответ Стива Беннета работает для простых команд, но ломается, когда вы цитируете такие аргументы, как следующие:

      $ git commit -m "foo bar" --allow-empty
error: pathspec 'bar' did not match any file(s) known to git.

Кажется, что сохранение полного списка аргументов в виде массива работает:

      function do_git {
  cmd=$1
  shift
  myArgs=( "$@" )

  if [ "$cmd" == "add" ]; then
    myArgs=( "-v" "${myArgs[@]}" )
  elif [ "$cmd" == "rm" ]; then
    myArgs=( "--cached" "${myArgs[@]}" )
  fi
  myArgs=( "$cmd" "${myArgs[@]}" )
  $(which git) "${myArgs[@]}"
}
alias  git='do_git'

Теперь команда выполнена успешно:

      $ git commit -m "foo bar" --allow-empty
/usr/bin/git commit -m foo bar --allow-empty
[master 699af14] foo bar

Это ответ Стива Беннетта, переведенный как о-о-о-о

function do_git {
  cmd=$1
  shift
  extra=""
  if [ "$cmd" '==' "add" ]; then
    extra="-v"
  elif [ "$cmd" '==' "rm" ]; then
    extra="--cached"
  fi
  "`whence -p git`" "$cmd" "$extra" "$@"
}
alias  git='do_git'

Знак равенства должен быть заключен в кавычки. И это не работает, так как просто возвращает, что "мерзавец" является псевдонимом.

Другие вопросы по тегам