Можно ли указывать пути перед другими параметрами в журнале git?

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


1
50
2

Ответы:

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