git 별칭 안에 bash 스크립트를 직접 포함하는 방법


82

다음 bash 쉘 코드를 임베드 할 수 있습니까?

for name in $(git diff --name-only $1); do git difftool $1 $name & done

git 별칭 생성에 직접 추가 :

git config --global alias.diffall ***my-bash-code-here***

이것은 이전 질문 / 답변 으로 이어지며 코드를 .sh 파일에 넣은 다음 파일에 별칭을 지정합니다.

git config --global alias.diffall '!sh diffall.sh'

그러나 단순성을위한 끝없는 탐구에서 파일을 건너 뛰고 별칭에 직접 코드를 삽입하는 방법이 있어야합니까? 형식을 알 수 없습니다 ...

답변:


95
git config --global alias.diffall '!sh diffall.sh'

이것은 한 가지 방식으로 중복됩니다. 어쨌든 $ PATH에 'diffall.sh'를 추가하려면 'git-diffall'로 저장하고 별칭을 선언하지 않도록하십시오. 예, "git diffall"이 실행합니다.


1
그. 중대하다. 처음에는 git 작업을 수행하기 위해 몇 가지 쉘 스크립트를 작성하고 접두사 'git-'를 지정했기 때문에 실수로 무언가를 실행 할까봐 걱정했지만 쉘 (zsh)이 자동 완성하지 않아서 명시 적으로 입력해야합니다. 그리고 자동 완성 동작을 원하면 자체 하위 명령에 git 별칭을 선언 할 수 있습니다. 이는 스크립트에서 하위 명령으로의 링크를 명시 적으로 만드는 요구 사항이기도합니다.
Jon Carter

1
그래, 그것은 그냥 탕이 필요 바이너리입니다 :! binary

1
별칭 내부 사용, 나를 위해 작동하지 않는 !sh git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')결과 /usr/lib/git-core/git: /usr/lib/git-core/git: cannot execute binary file. sh처음에는 유무 에 관계없이 모두 시도했습니다 .
Hi-Angel

36

git 별칭 내에서 명령을 실행하고 특히 해당 명령에 인수를 전달하려면 즉시 호출하는 임시 함수를 만들어야합니다.

$ vim ~/.gitconfig
...
[alias]
    # compare:
    foo = "! echo begin arg=$1/$2/end"
    foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f"

이 예제에서 함수는 아마도 여러분이 필요로하는 것일 것입니다 (또한 단일 "문"에서 할 수있는 것에 대해 더 유연합니다). 두 옵션 모두에 대해 git 명령의 나머지 인수는 "echo"또는 "f"인지 여부에 관계없이 별칭에 args로 전달된다는 것을 알 수 있습니다. 함수를 호출하는 것은 명시 적으로 사용되지 않는 것은 무시하고 단순히 args를 소비합니다.

$ git foo a b c
begin arg=a/b/end a b c

$ git foo2 a b c
begin arg=a/b/end

또 다른 예 (일치하는 패턴에 따라 모든 별칭 나열) (참고 : .gitconfig 전체에서 동일한 함수 이름 "f ()"를 계속 재사용 할 수 있음) :

[alias]
    alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f"

첫 번째는 "foo $"에 대한 별칭을 반환하고 두 번째는 "foo. *"에 대한 별칭을 반환합니다.

$ git alias foo
alias.foo ! echo begin arg=$1/$2/end

$ git alias 'foo.*'
alias.foo ! echo begin arg=$1/$2/end
alias.foo2 !f() { echo begin arg=$1/$2/end; }; f

(nb : 실제 결과는 쉘에 따라 다를 수 있습니다. Linux, Unix 및 Cygwin (Windows)에서 bash와 함께 사용하고 있습니다.)


git.wiki.kernel.org/index.php/Aliases#What.27s_new.3Fsh -c 는 사용자의 로그인 셸이 무엇인지 걱정할 필요가없는 방식으로를 사용 하도록 암시 적으로 권장 합니다.
clacke

내가 제공 한 함수 구문은 의도적으로 상당수의 셸 (sh / ksh / bash / zsh)에서 이식 가능하며 하위 프로세스를 시작하는 것보다 빠릅니다. 특정 플랫폼에 특정 이식성 문제가없는 한 함수 구문을 계속 사용하는 것이 좋습니다.
michael

귀하의 의견은 저를이 답변으로 되돌 렸으며 아마도 귀하의 방식을 사용할 것입니다. 그것은 한 수준의 견적을 저장하고 그 수준은 그대로 충분히 미쳤습니다. :-)
clacke

당신이 무슨 일을하는지 설명하는 좋은 기사와 같은이 외모 : atlassian.com/blog/git/advanced-git-aliases
가브리엘 스테이 플스

참고 :이 답변에 대한 후속 질문을 여기에 게시했습니다 : stackoverflow.com/questions/52123145/… . "어떻게 같은 내부 자식의 명령을 대체하는 git status사용자 정의 별칭"
가브리엘 스테이 플스에게

24

문서에서 찾을 수 없지만 경로에 "git- <name>"스크립트를 생성하면 저장소에서 "git name"으로 호출 할 수 있습니다.

보다:

$ cd ~/bin
$ echo "echo I love this log:
>pwd
>git log --graph  --summary --decorate --all" > git-logg
$ chmod +x git-logg
$ cd /path/to/your/repo
$ git logg
I love this log:
/path/to/your/repo
* commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch)
| Author: myself <my@Laptop.(none)>
| Date:   Fri Apr 1 16:47:20 2011 +0200
| 
|     would have been better not to do it at all
| 
...
$

따라서이 방식으로 원하는 별칭을 작성할 수도 있습니다.

또한 함수를 정의하는 새 명령에 자동 완성 기능을 추가 할 수 있습니다. 여기에 정보

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}

+1, git libexec 폴더에서만 작동한다고 생각했습니다. 덕분에이 팁을 공유
올리비에 Refalo

14

이 두 줄을 .git / config 파일에 추가하면 트릭을 수행 할 수 있습니다.

[alias]
    diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done'

편집 : 아마도 git-config 버전도 작동하지만 관리하기 쉽도록 구성 파일에 별칭을 유지하고 싶습니다.

git wiki에 별칭을 매우 명확하게 설명하는 멋진 페이지가 있습니다. http://git.or.cz/gitwiki/Aliases 특히 '인수가있는 고급 별칭'을 읽어보세요.


git config --global은 별칭을 $ HOME / .gitconfig에 저장합니다. 여기서 (IMO) 관리가 훨씬 더 쉽습니다. 별명이 저장소에 특정 될 필요는 거의 없습니다. (repo 특정은 repo / .git / config로 이동)
u0b34a0f6ae

David에게 감사합니다. 그러나 그것은 나를 위해 작동하지 않을 것입니다-당신이 포함시킨 훌륭한 링크의 변형 또는 변형. Windows 환경에서 실행 중이라고 언급 했어야했을까요? 감사합니다 Kaizer, 동의했습니다. 이것은 저에게 '글로벌'입니다.
Seba Illingworth

요즘에는 git.wiki.kernel.org/index.php/Aliases#Advanced 가 좋은 곳입니다. (git 또는 cz 링크는 거기로 리디렉션되지만이 섹션에서는 특히 인수를 사용하여 복잡한 작업을 실행하는 것에 대해 언급합니다.)
clacke

-4

(ProGit 문서에서 : http://progit.org/book/ch7-3.html )

.git / hooks에 스크립트를 추가해 보셨나요?

예를 들어 .git / hooks / post-checkout 스크립트를 생성하는 경우 :

#!/bin/bash

echo "This is run after a 'git checkout'"

그런 다음 다음 명령을 실행하십시오.

$ git checkout master
Switched to branch 'master'
This is run after a 'git checkout'

3
후크는 구성, 확장 및 별칭과 어떤 관련이 있습니까?
Steve Buzonas 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.