Псевдоним команды оболочки gitconfig запускается из верхнего уровня, а не из текущего каталога

Я написал bash-скрипт с именем git_diff_parent, который при передаче дескриптора фиксации выполняет git diff commit~1 commit; другими словами, он отличается от своего предка без указания commit~1 в командной строке. Я делаю это, анализируя командную строку git, находя, какой аргумент является строкой фиксации (используя git cat-file -t), заменяя его на commit~1 commit, а затем передавая новый список аргументов в git diff. Я присвоил этому сценарию псевдоним /etc/gitconfig, поэтому я могу выполнить эту команду как git diff-parent:

[alias]
   diff-parent = !git_diff_parent

Это почти работает, за исключением случаев, когда я пытаюсь сравнить отдельный файл из места, отличного от каталога репозитория верхнего уровня, например:

% pwd
/home/myhome/github/my-branch/rtl
% git diff-parent branch -- mycode.sv
<no output>
% git diff-parent branch -- rtl/mycode.sv
<diff output appears>

Чтобы отладить это, я добавил pwd в свой скрипт, чтобы увидеть рабочий каталог скрипта. О чудо, он всегда запускается из каталога верхнего уровня (/home/myhome/github/my-branch), а не из подкаталога, в котором я нахожусь. Я даже пробовал git -C . diff-parent ... безрезультатно.

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


person Tonillero    schedule 01.07.2020    source источник


Ответы (1)


https://git-scm.com/docs/git-config#Documentation/git-config.txt-alias

Обратите внимание, что команды оболочки будут выполняться из каталога верхнего уровня репозитория, который может не обязательно быть текущим каталогом. GIT_PREFIX устанавливается … из исходного текущего каталога.

(Подчеркнуть и вырезать — мои — phd)

Таким образом, вы можете сделать cd $GIT_PREFIX в сценарии оболочки git_diff_parent.

person phd    schedule 01.07.2020
comment
Как раз то, что мне было нужно. Благодарю вас! Одна небольшая поправка: GIT_PREFIX сбрасывается, если вы запускаете из каталога верхнего уровня, поэтому вам нужно поймать это условие с помощью чего-то вроде cd ${GIT_PREFIX:-.}, чтобы в этом случае оно изменилось на текущий каталог. - person Tonillero; 03.07.2020