programing

위치 매개 변수가 있는 Git 별칭

goodsources 2023. 5. 31. 15:52
반응형

위치 매개 변수가 있는 Git 별칭

기본적으로 저는 가명을 쓰려고 합니다.

git files 9fa3

...명령을 실행합니다.

git diff --name-status 9fa3^ 9fa3

하지만 git는 alias 명령에 위치 매개 변수를 전달하지 않는 것 같습니다.시도해 본 결과:

[alias]
    files = "!git diff --name-status $1^ $1"
    files = "!git diff --name-status {1}^ {1}"

...그리고 몇 가지 다른 것들은 효과가 없었습니다.

퇴화된 경우는 다음과 같습니다.

$ git echo_reverse_these_params a b c d e
e d c b a

어떻게 하면 이 일을 해낼 수 있을까요?

셸 기능은 이에 도움이 될 수 있습니다.

[alias]
    files = "!f() { git diff --name-status \"$1^\" \"$1\"; }; f"

이 없는 별칭!Git 명령으로 처리됩니다. 예:commit-all = commit -a.

!셸에서 자체 명령으로 실행되므로 이렇게 더 강력한 마법을 사용할 수 있습니다.

업데이
에 명은저루실서행로므사있수다를 할 수 .${GIT_PREFIX}에서 할 때 입니다.

찾으려는 별칭은 다음과 같습니다.

files = "!git diff --name-status \"$1\"^ \"$1\" #"

인수 유효성 검사 사용:

files = "!cd -- \"${GIT_PREFIX:-.}\" && [ x$# != x1 ] && echo commit-ish required >&2 || git diff --name-status \"$1\"^ \"$1\" #"

마지막은 중요합니다. 사용자가 제공한 모든 인수가 셸에 의해 처리되는 것을 방지합니다.

참고:git사용자가 제공한 모든 인수를 명령줄 끝에 넣습니다.이 기능을 사용하려면 다음을 시도하십시오.GIT_TRACE=2 git files a b c d

공백을 포함하는 파일 이름에는 이스케이프 따옴표(네스팅으로 인해)가 중요합니다."; rm -rf --no-preserve-root /;)

은 또한 참수있다니습도할다음을 참조할 수 .sh직접(함수를 만드는 대신):

[alias]
        files = !sh -c 'git diff --name-status $1^ $1' -

(줄 끝에 있는 대시에 주의하십시오. 필요합니다.)

깃맨 페이지에 설명된 GIT_TRACE=1을 사용하여 별칭 처리를 투명하게 합니다.

$ git config alias.files
!git diff --name-status $1^ $1
$ GIT_TRACE=1 git files 1d49ec0
trace: exec: 'git-files' '1d49ec0'
trace: run_command: 'git-files' '1d49ec0'
trace: run_command: 'git diff --name-status $1^ $1' '1d49ec0'
trace: exec: '/bin/sh' '-c' 'git diff --name-status $1^ $1 "$@"' 'git diff --name-status $1^ $1' '1d49ec0'
trace: built-in: git 'diff' '--name-status' '1d49ec0^' '1d49ec0' '1d49ec0'
trace: run_command: 'less -R'
trace: exec: '/bin/sh' '-c' 'less -R' 'less -R'
MM      TODO

원래 명령은 git 버전 1.8.3.4와 함께 작동합니다(Eimantas는 이 명령이 1.8.2.1에서 변경되었음을 확인했습니다).

sh -c '..' --그리고.f() {..}; f두 옵션 모두 "$@" 매개 변수를 다른 방식으로 깨끗하게 처리합니다(GIT_TRACE 참조).별칭에 "#"을 추가하면 뒤에 오는 매개 변수를 남기지 않고 위치 매개 변수를 사용할 수 있습니다.

위에서 Drealmer가 언급한 바와 같이:

!는 저장소의 루트에서 실행되므로 별칭을 호출할 때 상대 경로를 사용하면 예상한 결과를 얻을 수 없습니다.2013년 8월 8일 16시 28분 드리머 »

GIT_PREFIX현재 위치한 하위 디렉터리로 git하여 설정하면 디렉터리를 먼저 변경하여 이 문제를 피할 수 있습니다.

git config --global alias.ls '!cd "${GIT_PREFIX:-.ls-al'

다음과 같은 작업을 수행하는 별칭을 사용하여 이 작업을 수행하고 싶었습니다.

git checkout $1;
git merge --ff-only $2;
git branch -d $2;

결국 다음과 같은 내용을 포함하는 git-m이라는 이름의 셸 스크립트를 만들었습니다.

#!/bin/bash -x
set -e

#by naming this git-m and putting it in your PATH, git will be able to run it when you type "git m ..."

if [ "$#" -ne 2 ]
then
  echo "Wrong number of arguments. Should be 2, was $#";
  exit 1;
fi

git checkout $1;
git merge --ff-only $2;
git branch -d $2;

이것은 여러 줄로 되어 있기 때문에 훨씬 더 읽기 쉽다는 장점이 있습니다.게다가 나는 bash를 부를 수 있는 것이 좋습니다.-x그리고.set -e여러분은 아마도 이 모든 것을 가명으로 할 수 있지만, 그것은 매우 추악하고 유지하기 어려울 것입니다.

파일 이름이 지정되어 있기 때문입니다.git-m다음과 같이 실행할 수 있습니다.git m foo bar

방금 비슷한 것에 부딪혔어요. 제 노트를 올려도 괜찮길 바래요.나를 혼란스럽게 하는 한 가지는git인수가 인가있별칭는, 도에왔것입다니에서 입니다.git help config1.7.9.5 버전이 있습니다.)

별칭 확장 앞에 느낌표가 있으면 셸 명령으로 처리됩니다.예를 들어, "alias"를 정의합니다.new = !gitk --all --not ORIG_HEAD", 호출 "gitnew"는 셸 명령 "gitk --all --not ORIG_HEAD"를 실행하는 것과 같습니다.셸 명령은 저장소의 최상위 디렉터리에서 실행되며, 이 디렉터리가 반드시 현재 디렉터리일 필요는 없습니다. [...]

- 이 붙었을 때 "될 것"이라면- 해야 할 입니까, 함수를 사용해야 할 이유가 무엇입니까?sh -c내 명령을 있는 그대로 쓰지 않는 이유는 무엇입니까?

저는 여전히 답을 모릅니다. 하지만 저는 사실 결과에 약간의 차이가 있다고 생각합니다. - 을 당신의 여기작테있습다니가트에 . 이것을 당신의 안에 던져보세요..git/config또는 당신의~/.gitconfig:

[alias]
  # ...
  ech = "! echo rem: "
  shech = "! sh -c 'echo rem:' "
  fech = "! f() { echo rem: ; }; f " # must have ; after echo!
  echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
  fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "

다음은 이러한 별칭을 실행하는 방법입니다.

$ git ech word1 word2
rem: word1 word2

$ git shech word1 word2
rem:

$ git fech word1 word2
rem:

$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2

$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/

"때: " 다dll " 명에 " 령을 " 사할 " 용때 " 또음 " "" " 사할 dll용 " ▁or때 " ▁command▁you " plain▁after " 을▁a " :!의 "있는 그대로"git-그 다음에 별칭 - 그다면렇git인수 목록을 해당 명령에 자동으로 추가합니다! - 이피하는스를함트인호또것는다입출니하로수는를수크립제로실에 대한 입니다.sh -c.

또 여서기또다흥운점미은셸로스일에서반자것다입니는변다예상한동수를로으적트크립른▁the▁another▁variable다▁expects▁automatic▁in,니것입▁that▁one▁typically▁(▁script▁a▁here▁shellfor는▁interesting▁thing),다여한을 예상한다는 것입니다.$0스크립트의 파일 이름이 됩니다.하지만 당분간은git 함수, 칭함수별,$0인수는 기본적으로 해당 명령을 지정하는 전체 문자열의 내용입니다(구성 파일에 입력됨).

그렇기 때문에 만약 당신이 인용문을 잘못 쓴다면, 아래의 경우, 그것은 외부 이중 인용문에서 벗어나는 것일 것입니다.

[alias]
  # ...
  fail = ! \"echo 'A' 'B'\"

- 그때git(에게는) 된 메시지와 함께

$ git fail
 "echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory

봤을 때는 제가봤때는을때.git"는 문자열 를 "saw"라는 !했고, 그에 하여 실행파일실시도검실만패다했습니색에지했고려행하로▁finding를 찾지 못했습니다."echo 'A' 'B'"종렬로

에서, 서에맥락그.git help config위의 인용문을 인용하면 다음과 같은 것을 말하는 것이 더 정확할 것으로 추측됩니다: "... 호출 "gitnew"는 셸 명령 "gitk --all --not ORIG_HEAD $@"를 실행하는 것과 같습니다. 여기서 $@는 실행 시 명령줄에서 git 명령 별칭으로 전달되는 인수입니다. ...저는 그것이 OP의 "직접적" 접근법이 위치 매개 변수와 함께 작동하지 않는 이유도 설명할 수 있다고 생각합니다.

언급URL : https://stackoverflow.com/questions/3321492/git-alias-with-positional-parameters

반응형