힘내 별칭-여러 명령 및 매개 변수


182

여러 Git 명령과 위치 매개 변수를 모두 사용하는 별칭을 만들려고합니다. 각 페이지마다 Stackoverflow 페이지가 있으며 두 가지를 모두 수행하는 것이 고통스럽게 보이지만 문제가 있습니다.

예를 들어, 분기 foo로 전환하고 상태를 수행하고 싶습니다. 내에서 .gitconfig, 나는 :

  [alias] 
     chs = !sh -c 'git checkout $0 && git status'

작동하지 않습니다. 이와 같은 것이 효과가 있습니다.

chs = !sh -c 'git checkout $0'

echoes = !sh -c 'echo hi && echo bye'

모든 통찰력은 인정 될 것입니다.


내 별칭 : git config --global alias.go '! git commit -a && git pull --rebase && git push && git status'. 참고 : 간단한 따옴표를 사용하십시오.
Marcus Becker

답변:


157

이것은 작동합니다 (zsh 및 bash로 테스트).

[alias] chs = !git checkout $1 && git status

1
아닙니다. 힘내로 변신 git chs foo합니다git checkout && git status foo
릴리 발라드

24
흥미롭게도 git은 실제로 쉘 별명으로 위치 변수를 채 웁니다. 그러나 그것은 여전히 ​​논쟁의 여지가 있기 때문에 여전히 깨졌습니다. echo $1 && echo done'foo'인수와 함께 호출하면 의 별칭이 "foo"및 "done foo"를 모두 출력합니다.
릴리 발라드

7
의 첫 번째 호출에 대한 앞의 느낌표는 무엇입니까 git?
Elijah Lynn

21
@ EllijahLynn : 자식 별칭에서 선행 !방법은 모든 것을 쉘에 전달합니다. 그렇지 않으면 다른 git 명령을 실행하려고한다고 가정하고 git바이너리에 인수로 전달합니다 .
Lily Ballard

2
@Brondahl Clever. 그래도 ;:대신 권장 합니다 && :. 그리고 그것은 유닉스에서도 잘 작동합니다.
릴리 발라드

82

이것은 Windows 배치 / msysgit bash를 대상으로합니다. 다른 환경에서는 작동하지 않을 수 있습니다.

올리비에 베르디 어와 릴리 발라드가 말했듯이

[alias] chs = !git checkout $1 && git status

거의 작동하지만 인수를 추가로 추가 삽입합니다 ...

git chs demo -> git checkout demo && git status demo

그러나 && :별칭 끝에 추가 하면 가짜 인수가 위치 태그에 사용됩니다.

그래서

[alias] chs = !git checkout $1 && git status && :

올바른 출력을 제공합니다 ... git chs demo -> git checkout demo && git status


9
&& :금이며, 추가 인수가 문제가 될 것입니다 명령에 대한이 솔루션 작업을합니다.
Clay

3
@Clay (또는 다른 사람)-누군가 BASH에게 무엇을 설명했는지 설명 할 수 && :있습니까?
Justin Morgan

7
@JustinMorgan &&는 이전 명령이 0 (성공)으로 바뀌면 && 다음에 명령을 실행합니다. ':': 1. 콜론, 상태 0 바로 여기에 몇 가지 용도 인수를 확장하고 리디렉션을 수행하고 반환 이상 아무것도하지 않습니다 명령이 내장 쉘이며, a=123;$a오류,하지만 a=123; : $a하지 않습니다는. 2. : > hello.txt빈 상자는 hello.txt. 3. if [ "$a" = "hello" ];then : ;fi':'없이 정상이지만 오류가 발생합니다. pass파이썬 과 같습니다 . 4. : this is a comment콜론 뒤에 공백이 있으면 #주석 행에서 와 같이 작동 합니다.
ElpieKay

2
이것은 그런 핵이다 ... git은 다중 명령 모드를 받아 들여야한다
kchoi

1
설명을 주셔서 감사합니다 @ElpieKay. 하나의 프로젝트에 대한 내 로컬 자식 별칭 co = !git checkout public/compiled && git checkout $1git co master내가 할 때 메시지를 error: pathspec 'master' did not match any file(s) known to git.받습니다. 첫 번째로 언급 한 것은 Windows이고 Linux에 있기 때문에이 답변이 유용하지 않을 것이라고 생각했습니다. 그러나 당신은 이유를 설명했습니다.
Tyler Collier

73

쉘 기능을 정의 할 수 있습니다.

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"

나는 다른 stackoverflow 페이지에서 이것을 보았지만 cygwin 터미널은 그것을 실행하려고 할 때 함수가 인식되지 않는다고 말합니다.
Stella

@ Stella :이 구성 파일 구문이 유용하지 않은 인용 부호를 남겼습니다. 가지고 있지 않은지 확인하십시오.
릴리 발라드

2
와우 ... 불행히도, 이것은 모든 버전 문제였습니다. 나는 Git 1.7.3을 사용하고 있었고이 방법들 중 어느 것도 효과가 없었다. 나는 1.7.6과 짜잔으로 업데이트했는데 모든 것이 효과가있었습니다. 고마워요!
Stella

5
Windows를 사용하는 경우 쉘 함수 정의를 큰 따옴표로 묶어야한다고 생각합니다."
drzaus

4
Olivier의 답변은 매개 변수 (OSX)를 사용하여 작동하지 않았습니다. 이것은 완벽하게 작동했습니다.
하드 슈나이더

25

여러 줄로 된 복잡한 git 별칭을 만들 수있었습니다. 그들은 Windows에서 잘 작동하지만 다른 곳에서도 작동한다고 가정합니다.

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

나는 글을 썼고 여기에 몇 가지 예가 더 있습니다 .



잘 했어! 그 기사는 어떤 라이센스로 출판됩니까? 러시아어로 StackOverflow의 일부를 번역해도 될까요?
Nick Volynkin

@NickVolynkin 답변이 늦어 죄송합니다. :) 당신 물론이 가서 감사
VitalyB

22
[alias]
chs = !git branch && git status

8
무엇입니까 !?
AutonomousApps

1
나는 doc을 찾을 수 없지만 !기본적으로 git은 별명이 git 명령이라고 가정하므로 t = status작동합니다. 그러나 시도 t = git status하면 작동하지 않습니다 ( "git"명령을 찾을 수 없음). 따라서 !들어오는 위치에서 쉘처럼 명령을 실행하도록 지시하며 일반적으로 별칭마다 여러 개의 git 명령이있을 때이를 필요로하므로 t = !git status && git log예를 들어 작동 할 수 있습니다 .
로랑

다음은 Git 별칭의 느낌표 (!)를 처리하는 StackOverflow 질문입니다. stackoverflow.com/questions/21083933/… .
Jacob Lockard

6

이거 한번 해봐:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

다음과 같이 호출하십시오. git chs master


6

\각 줄의 끝에 추가하여 여러 줄 git 별칭을 가질 수 있습니다 .

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "

2
감사! 실제로 "!git fetch --prune --all; git pull --rebase upstream master; git push origin master"내 별칭을 사용 하는 데 아무런 문제가 없었습니다 .
Droogans

3

여기서 문제는 위치 매개 변수가 git 1.9.2에서와 같이 쉘 명령으로 두 번 전송되는 것 같습니다. 무슨 뜻인지 확인하려면 다음을 시도하십시오.

[alias]
  test = !git echo $*

그런 다음을 수행하십시오 git test this is my testing string. 다음 출력을 관찰해야합니다 (명확성을 위해 마지막 두 줄 편집).

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

이 문제를 해결하는 한 가지 방법은

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null

마지막 에코 명령에 적용되고 결과에 영향을 미치지 않으므로 추가 위치 매개 변수가 사용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.