Я хочу создать псевдоним git, в котором часть <path>
является частью псевдонима, но где я все равно могу передавать дополнительные параметры.
В настоящее время это соответствующие псевдонимы в моей конфигурации git:
[alias]
lol = log --graph --decorate --pretty=oneline --abbrev-commit --abbrev=8
lolst = "!git lol --name-status $(git diff --staged --name-only | tr '\\n' ' ')"
# Simpler version just for this Q/A.
logst = "!git log $(git diff --staged --name-only | tr '\\n' ' ')"
Назначение lolst
и logst
— показать историю всех подготовленных файлов. На самом деле это работает так, как задумано.
Теперь я хочу иметь возможность добавлять дополнительные параметры с помощью этих команд.
Например. git lolst -U3
, чтобы показать разницу с каждым коммитом.
Однако это дает мне «фатальный результат: опция '-U3' должна идти перед аргументом, не являющимся опцией».
Понятно, почему это происходит: список файлов должен идти после аргументов.
Как я могу создать псевдоним, чтобы потом добавить дополнительные параметры?
Как только у меня будут идентификаторы коммитов, я смогу сделать git commit --fixup=<commit id>
. Тогда git rebase -ir --autosquash <some ancestor ref>
. Я также создал для них псевдонимы, но они выходят за рамки данного вопроса.
lolst = "!f() { git lol --name-status \"$@\" -- $(git diff --staged --name-only); }; f"
Чтобы выполнить переупорядочение, вам необходимо определить и вызвать функцию оболочки для управления списком аргументов, если вы хотите, чтобы остальные аргументы находились где угодно, но не в конце, куда их помещает вставка псевдонимов Git.
Нет необходимости переводить символы новой строки, разделение слов оболочки рассматривает пробелы как разделители аргументов, а символы новой строки являются пробелами.
Я ожидаю, что кто-то, кто знает дубликат этого вопроса, скоро придет и закроет его как дубликат, это нормально.
Что касается возможного дубликата: в конце концов, это будет еще одна точка входа для людей, чтобы найти то, что они ищут.
xargs
должен быть в состоянии помочь здесь.
Поскольку имена файлов идут последними в журнале git, должно работать следующее:
[alias]
logst = "!git diff --staged --name-only | xargs git log"
Теперь мы можем добавить другие параметры журнала git. Например:
git logst --pretty=online -n 10
Просто имейте в виду, что если количество проиндексированных файлов велико (или имена файлов очень длинные), то xargs
будет запускаться git log
более одного раза.
возможно, это имеет отношение к ОП: xargs
также имеет опцию -r | --no-run-if-empty
, чтобы вообще не запускать git log
, если у вас нет промежуточного различия.
Спасибо вам обоим! Оба ответа (этот и @tmaj) делают свое дело, и я не видел ограничений. Ответ @tmaj выглядит более читабельным, и в нем больше знаний. Я приму другой ответ, но оба хороши.