-u없이 업스트림을 자동으로 설정하도록 git push를 구성하는 방법은 무엇입니까?


104

내가 원하는 git push origin로컬에서 생성 된 분기를 처음으로 푸시 할 때 업스트림 참조를 자동으로 설정하고 .

에 대해 알고 git push -u있지만 -u이전에 사용했는지 또는 업스트림 참조를 설정 했는지 여부에 대해 생각하고 싶지 않습니다 . 즉, 업스트림이 아직없는 브랜치의 푸시에 git push자동으로 영향을 미치고 싶습니다 git push -u.

이것이 가능한가? 별칭이나 유틸리티 스크립트가 필요한 경우 괜찮습니다.


2
git-config (1) 에서 push.defaultbranch.<name>.merge옵션 을 사용할 수 있는지 확인 했습니까 ?

5
나는 push.default설정했다 current-그것이 내가 git push originrefspec이나 업스트림없이 말할 수있는 방법 입니다. 그러나 업스트림을 자동으로 설정하는 데는 도움이되지 않습니다.
요한 복음

답변:


65

git config사용하여 구성 할 수 있습니다 git config --global push.default current.

문서 : https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault


9
나는 그 세트를 가지고 있습니다. 그것이 git push originrefspec이나 업스트림없이 말할 수있는 방법 입니다. 그러나 업스트림을 자동으로 설정하는 데는 도움이되지 않습니다.
John

나를 위해 작동 : 1 :
팀 Strijdhorst

1
예, @John이 말했듯이, 이것이 로컬 브랜치가 원격 브랜치를 추적하도록 만들지 는 않는다는 것을 명심하는 것이 중요합니다 . 로컬 브랜치와 동일한 이름으로 원격 브랜치를 생성합니다.
waldyrious

필요한 경우 충분합니다 push. 예를 들어 한 명의 개발자 만 그의 브랜치에 있고 저장소의 사본 하나만 편집합니다.
superarts.org

27

git config를 사용하여 이것이 가능하지 않다고 생각하므로 다음은 bash에서 수행 할 수있는 작업입니다.

[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push

현재 분기에 원격 추적 분기가 있으면 호출하고 git push그렇지 않으면 호출합니다. git push -u


24
이제 할 수 있습니다 git config --global push.default current.
Andrea Bergonzo

2
@AndreaBergonzo 이것은 나에게 유일한 좋은 대답입니다. 대답으로 추가 할 수 있습니까?
pdem

8
@AndreaBergonzo, @pdem- push.default=current로컬 브랜치와 이름이 같은 원격 저장소에만 브랜치를 생성하지만 원격 브랜치를 추적하도록 로컬 브랜치를 설정 하지는 않습니다 . 왜 그런지 잘 모르겠지만 명심할 가치가 있습니다.
waldyrious

22

참고 : 새 기본 푸시 정책 " simple" 이 업스트림 브랜치를 갖는 브랜치에 의존 한다는 사실은 다음을 의미합니다.
업스트림 브랜치를 설정하는 것은 숨겨진 자동화 된 단계가 아니라 자발적인 단계로 간주됩니다.

" git push [$there]"이 무엇을 푸시할지 말하지 않으면 지금까지 전통적인 "일치"의미를 사용했습니다 (이미 같은 이름의 분기가있는 한 모든 분기가 원격으로 전송되었습니다).

현재 분기가 해당 원격 분기와 통합되도록 설정된 경우에만simple 현재 분기를 동일한 이름의 분기로 푸시 하는 " "의미 체계를 사용합니다 . 이를 변경할 수 있는 사용자 기본 설정 구성 변수 " "이 (가) 있습니다.
push.default


따라서 Mechanicalfish대답을 바탕으로 오른쪽 큰 따옴표 ( ")를 이스케이프 ( \")로 사용하여 별칭을 정의 할 수 있습니다 .

git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"

git pu origin

Sc0ttyD 는 주석 에서 다음 별칭을 제안합니다 .

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

여러 줄 :

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && 
           git push -u origin $(git symbolic-ref --short HEAD) || 
           git push'

1
별칭 설정 방법을 보여 주셔서 감사합니다. 그래도 답변의 첫 번째 부분과의 관련성 또는 관련성이 명확하지 않습니다.

2
@John 내 요점은 : 의도적 인 단계로 간주되는 단계를 우회 할 것입니다. 해당 별칭을 설정할 수 있지만이 명시 적 -u옵션이 존재하는 이유와 해당 옵션을 자동으로 만드는 구성이없는 이유 (따라서 별칭) 를 다른 독자에게 명확히하고 싶었습니다 .
VonC 2013 년

2
내 .zshrc에 zsh 별칭 목록이 있습니다. 이 답변을 수정하여 다음 zsh 별칭을 만들었습니다.alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
Sc0ttyD

2
@ Sc0ttyD 흥미 롭군요, 감사합니다. 더 많은 가시성을 위해 답변에 귀하의 의견을 포함했습니다.
VonC

20

나는 같은 문제가 있었다. 이 별칭 (.gitconfig)을 찾았습니다.

[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"

사용량 : git track새 지점 당 한 번 (현재 체크 아웃). 그런 다음 평소대로 누르십시오 :)


15

@VonC 및 @Frexuz의 답변은 도움이되지만 두 솔루션 모두 저에게 오류를 생성합니다. 두 가지 답변을 모두 사용하여 저에게 적합한 것을 조합했습니다.

    [alias]
    pu = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push

이로 인해 업스트림 (속성 )이 정의 되었는지 여부에 따라 git push -u origin $BRANCHNAME또는 을 실행합니다 .git pushbranch.$BRANCHNAME.merge

명령 줄에이 별칭을 입력하려면 이스케이프 코드가 필요하므로 편집기를 사용하여 올바른 파일 ( $HOME/.gitconfig(global), .git/config(local) 또는 /etc/gitconfig(system)) 에 삽입하는 것이 가장 쉽습니다.


3
이것은 가장 간단하고 완전한 대답입니다. 파일을 git config --global -e
찾지

5

이 간단한 Bash 스크립트를 사용하여이 문제를 해결했습니다. 기존 브랜치에서는 작동하지 않지만이 기능으로 모든 브랜치를 생성하면 항상 업스트림 브랜치가 자동으로 설정됩니다.

function con { git checkout -b $1 && git push --set-upstream origin $1; }

$ 1은 다음 con과 같이 전달하는 첫 번째 인수를 나타냅니다 .

git checkout -b my-new-branch && git push -u my-new-branch

... 이렇게하면 :

con my-new-branch

5

짧은 답변

실제로 명시적이고 -u필요할 때 옵션을 사용하고 싶지만 전체를 입력하고 싶지 않은 경우 :

git push -u origin foo

그런 다음 다음 별칭을 사용할 수 있습니다.

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

다음을 입력하면됩니다.

git push-u

긴 대답

일반적으로 -u(의 약어)에 대한 필요성 --set-upstream은 방금 새 로컬 브랜치를 생성하고 커밋하고이를 업스트림으로 푸시하려는 경우입니다. 원격 저장소에는 아직 새 브랜치가 없으므로 커밋을 푸시하기 전에 git에게 원격 브랜치를 만들고 추적하도록 지시해야합니다. 이것은 브랜치에 대한 첫 번째 푸시에만 필요합니다. 다음은 일반적인 시나리오입니다.

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push -u origin foo      # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

개인적으로 저는 git push -u원격 브랜치를 만들 때 명시 적이 필요하다는 점을 좋아합니다 . 완전히 새로운 브랜치를 세상에 공유하는 매우 중요한 작업입니다.

그러나 나는 명시 적으로 작성해야하는 것이 싫다 git push -u origin foo. 입력하는 것이 고통 스러울뿐만 아니라 더 중요한 것은 오류가 발생하기 쉽다는 것입니다! 지점 이름을 입력 할 때 실수하기 쉽고 새 원격 지점은 로컬 지점과 동일한 이름을 갖지 않습니다! 대부분의 경우 실제로 업스트림 저장소가origin 이고 업스트림 분기는 로컬 분기와 동일한 이름을 갖기 .

따라서 Mark가 제공 한.gitconfig 우수한 답변 의 하위 집합 인 my에서 다음 별칭을 사용하고 있습니다 .

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

이제 다음을 수행 할 수 있습니다. 이는 여전히 명시 적이지만 오류가 덜 발생합니다.

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push-u                  # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

3

간단히:

$ alias gush="git push -u origin HEAD"

2
질문 제목 : "-u없이 자동으로 업스트림을 설정하도록 git push를 구성하는 방법?" 설명 : "에 대해 알고 git push -u있지만 ...". 그래서 이것은 질문에 대한 답이 아닙니다.
John

2
@John 나는 간단한 별칭을 제안하기 위해 내 대답을 업데이트했습니다.
djanowski

2
@John 지금 질문에 대답합니까?
djanowski

1
@ ILI4SK4RIM 감사합니다, 내 대답은 간단 하나입니다 미친, 아직 그것의 -1 _ (ツ) _ / ¯
djanowski

2

가능한 적은 키 누르기로만 내장 git 기능을 사용하려면 다음을 입력하십시오.

$ git push -u o tab H tab

자동 완성 기능은 $ git push -u origin HEAD

OSX에서 자동 완성을 활성화하려면 이 콘텐츠~/.git-completition.bash파일 설정하고 파일 에 다음 줄을 추가하고 ~/.bash_profile터미널을 다시 시작하십시오.

# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

vscode 등의 내장 터미널에도 영향을 미칩니다.


1
자동 완성? git에는 자동 완성 기능이 없습니다. 셸 (bash? zsh?)에 자동 완성 규칙 집합이로드되어 있습니다. 사용중인 자동 완성 규칙 집합에 대한 정보를 제공 할 수 있으며 어디서 얻을 수 있습니까?
vy32

오, 정말 감사합니다. 자동 완성 설정으로 답변을 완료했습니다.
gazdagergo

~ / .git-completion.bash 파일의 내용을 모르면 대답을 사용할 수 없습니다.
vy32

1
좋은 지적. 나는 나의 출처를 찾아 git-completition.bash내 대답에 추가했습니다.
gazdagergo


0

어떤 이유로 든 다른 답변이 작동하지 않는 git push경우이 bash 함수로 대체 하여 필요할 때 올바른 플래그로 푸시 요청을 자동으로 다시 보낼 수 있습니다.

gitpush()
{
    git push -v 2>&1 | # perform push command, pipe all output
    tee /dev/tty | # keep output on screen and pipe it forward
    (
     cmd=$(sed -n "s/^.*\(git push --set-upstream origin .*\)$/\1/p");
     [[ -n "${cmd// }" ]] && (echo "> $cmd"; eval $cmd);
    ) # if we get output that matches the command to perform, execute it
}

푸시 출력의 진행률 부분을 희생하게 될 것이지만 그 외에는 모든 것이 예상대로 작동합니다.

개인적으로 JT Jobe의 답변을 사용할 것 입니다.

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