programing

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

stoneblock 2023. 7. 3. 22:32

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

나는 되고 싶다.git push origin로컬로 만든 분기를 처음으로 누를 때 업스트림 참조를 자동으로 설정합니다.

에 대해 알고 있습니다.git push -u하지만 제가 사용해 본 적이 있는지 없는지에 대해 생각하고 싶지 않아요.-u업스트림 기준을 설정하기 전 또는 설정합니다.다시 말해서, 나는 원합니다.git push으로 자적으효의 git push -u업스트림이 없는 지점의 푸시에서.

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

여 구있수다니습성으로 할 수 .git config --global push.default current()로 현재 분기를 밀어넣어 같은 이름의 분기를 업데이트합니다.

2022 업데이트 (git>=2.37.0)

git config --global --add --bool push.autoSetupRemote true업스트림 추적(docs)을 설정하는 동안 동일한 작업을 수행합니다.

2022: Git 2.37은 다음을 제안합니다.

git config --global push.autoSetupRemote true

push.autoSetupRemote

"로 설정된 경우true를 자임하다--set-upstream분기에 때 push에; 재분기대현업적존재시지않는우푸시본기경하에이한추림스.

은 " 옵은다같적다니됩용이과음이션다"와 함께 적용됩니다.push.default'simple', 'upstreamdiscovery'current'.

이 기능은 기본적으로 새 분기를 기본 원격으로 푸시하려는 경우에 유용합니다(예: '의 동작).push.default=current및.'라는 메시지가 표시됩니다.
많은 을 얻을 수 옵션의이가많장누이수같다다습음니과는우로워플크있는릴점'입니다.simple모든 분기가 원격에서 동일한 이름을 가져야 하는 중앙 워크플로우입니다.


2013: 참고: 새로운 기본 푸시 정책 ""simple이 업스트림 정책을 가진 지점에 의존한다는 사실은 다음을 의미합니다.
자동화된 자발적인 됩니다.

"일 때"git push [$there]무엇을 눌러야 하는지는 말하지 않습니다. 지금까지 전통적인 "filename" 의미를 사용했습니다(같은 이름의 브랜치가 이미 있는 한 모든 브랜치가 원격으로 전송되었습니다).

"" 사용합니다를다▁the"를 할 것입니다.simple현재 분기가 해당 원격 분기와 통합되도록 설정된 경우에만 현재 분기를 동일한 이름의 분기로 푸시하는 의미론입니다.
설정 변수 " " " 가 있습니다.push.default이것을 바꾸기 위해.


따라서 기계어의 답변을 기반으로 올바른 이중 따옴표를 사용자 이름)를 사용하여 별칭을 정의할 수 있습니다.") 이스케이프(\"):

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'

git config를 사용해서는 이것이 불가능하다고 생각하기 때문에 bash에서 할 수 있는 것은 다음과 같습니다.

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

지점이 추적 지점을 합니다.git push그렇지 않은 경우에는git push -u

저도 같은 문제를 겪었습니다...gitconfig)

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

용도:

  1. 새 분기당 한 번(현재 체크아웃됨): git track
  2. 정상적으로 밀어주세요 :)

@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 (으),.git/config (local), 또는/etc/gitconfig (설정)

단답형

만약 당신이 실제로 명시적이고 사용하는 것을 좋아한다면.-u필요할 때 옵션을 선택하지만 전체를 입력하지는 않습니다.

git push -u origin foo

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

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

간단히 다음과 같이 입력합니다.

git push-u

긴 대답

적으필것은의 .-u( for (으)로 표시됩니다.--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로컬 분기와 동일한 이름을 가진 업스트림 분기.

따라서, 나는 내 별명에서 다음과 같은 별명을 사용하고 있습니다..gitconfig이는 Mark가 제공하는 우수한 답변의 하위 집합입니다.

[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

이 간단한 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

가능성이 적은 키 누르기 기능만 사용하려면 다음과 같이 입력합니다.

$ 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 등의 내장 단말기에도 영향을 미칩니다.

이것에 대한 유일한 완전히 솔직한 대답은 "당신은 할 수 없습니다"입니다.

저는 여기에 있는 모든 응답들과 같은 질문들을 읽었습니다.

게시된 모든 답변은 새 지점에 처음 푸시할 때 특수 매개 변수를 전달해야 합니다.

오늘 "push.autoSetupRemote" 옵션을 발견했습니다.git 구성 도움말에는 다음과 같은 내용이 있습니다.

If set to "true" assume --set-upstream on default push when no upstream tracking exists for the current branch; this option takes effect with push.default options simple,
       upstream, and current. It is useful if by default you want new branches to be pushed to the default remote (like the behavior of push.default=current) and you also want
       the upstream tracking to be set. Workflows most likely to benefit from this option are simple central workflows where all branches are expected to have the same name on
       the remote.

단순:

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

나는 다음과 같은 유용한 스크립트로 Git 확장을 만들었습니다.

usage: git line push

Push the current branch and set an upstream if needed.

https://github.com/jvenezia/git-line

어떤 이유로든 다른 대답이 당신에게 통하지 않는다면, 당신은 대체할 수 있습니다.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의 답변을 사용하겠습니다.

언급URL : https://stackoverflow.com/questions/17847213/how-to-configure-git-push-to-automatically-set-upstream-without-u