programing

어떤 Git 브런치가 어떤 리모트/업스트림 브런치를 추적하고 있는지 어떻게 알 수 있습니까?

oldcodes 2023. 4. 9. 22:22
반응형

어떤 Git 브런치가 어떤 리모트/업스트림 브런치를 추적하고 있는지 어떻게 알 수 있습니까?

는 할 수 것을 .git branch --all로컬 브랜치와 리모트 브랜치 모두 표시되지만 이들 브랜치 간의 관계를 표시하는 데는 그다지 도움이 되지 않습니다.

어떤 로컬브런치가 어떤 리모트를 추적하고 있는지를 나타내는 방법으로 브랜치를 리스트 하려면 어떻게 해야 합니까?

매우 자기 명령어입니다.스크립트 작성에 이 명령어를 사용하는 것은 좋지 않습니다.

git branch -vv   # doubly verbose!

git 1.8.3에서는 업스트림 브랜치가 파란색으로 표시됩니다('What is this branch tracking (만약 있다면)' 참조).")


깨끗한 출력을 원한다면 Carl Suster의 답변을 참조하십시오.이 답변은 제가 처음 이 답변을 작성했을 때는 존재하지 않았다고 생각되는 자기 명령어를 사용하기 때문에 좀 더 간결하고 단순히 Marge가 아닌 rebase용으로 구성된 브랜치와 연동됩니다.

git remote show origin

'origin'은 리모컨의 이름이 무엇이든 간에 대체하십시오.

man을 보면git-rev-parse하다

<branchname>@{upstream} 예 , ) 。master@{upstream},@{u}

「」@{upstream}<branchname>@{u}에 의해 된 브랜치가 입니다).브랜치네임이 없으면 디폴트로 현재 브랜치네임이 됩니다.

브런치 master하다

git rev-parse --abbrev-ref master@{upstream}
# => origin/master

각 브랜치의 정보를 인쇄하려면 , 다음과 같이 할 수 있습니다.

while read branch; do
  upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
  if [[ $? == 0 ]]; then
    echo $branch tracks $upstream
  else
    echo $branch has no upstream configured
  fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)

# Output:
# master tracks origin/master
# ...

이는 refs 및 Configuration을 수동으로 해석하는 것보다 깨끗합니다.

, 쿠비의 것이 ..git/config「 」 「 」 、 「 」 。

cat .git/config

git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

는 각 로컬브런치의 회선을 나타냅니다.추적 브랜치는 다음과 같습니다.

master <- origin/master

추적하지 않는 것은 다음과 같습니다.

test <- 

현재의 브랜치에서는, 다음의 2개의 선택지가 있습니다.

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

또는

% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline

중복으로 (잘못) 표시된 약간 다른 질문에 대한 답변도 여기에 있습니다.

지부에서는 '지부 '지부', '지부', '지부', '지부', '지부보다'git checkout(일부러)이는 현재 브랜치에 대한 추적 정보가 있는 경우 이를 표시하기 위한 부작용과 함께 no-op입니다.

$ git checkout 
Your branch is up-to-date with 'origin/master'.

여기 깔끔하고 간단한 것이 있습니다.할 수 있다git remote -v 현재의 branch.의 모든 을 나타내고

나는 이 가명을 쓴다.

git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'

그리고나서

git track

Olivier Refalo의 답변에 근거합니다.

if [ $# -eq 2 ] 
then
    echo "Setting tracking for branch " $1 " -> " $2
    git branch --set-upstream $1 $2
else
    echo "-- Local --" 
    git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
    echo "-- Remote --" 
    REMOTES=$(git remote -v) 
    if [ "$REMOTES" != '' ]
    then
        echo $REMOTES
    fi  
fi

트랙이 설정된 로컬만 표시됩니다.

경로의 git-track이라는 스크립트에 쓰면 git track 명령어를 얻을 수 있습니다.

자세한 내용은 https://github.com/albfan/git-showupstream를 참조하십시오.

git config --get-regexp "branch\.$current_branch\.remote"

추적 중인 리모트 이름을 알려드립니다.

git config --get-regexp "branch\.$current_branch\.merge"

추적 중인 리모트브런치 이름이 표시됩니다.

$current_branch를 현재 브랜치 이름으로 대체해야 합니다.이를 통해 동적으로 얻을 수 있습니다.git rev-parse --abbrev-ref HEAD

다음 미니 스크립트는 이러한 것들을 조합한 것입니다.다음 파일에 붙입니다.git-tracking실행 가능한 상태로 하고 경로에 있는지 확인합니다.

그럼 이렇게 말할 수 있겠군

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

리모트 브랜치명은 로컬 브랜치명과 다를 수 있습니다(일반적으로는 다를 수 없습니다.예를 들어 다음과 같습니다.

$git tracking 
xxx_xls_xslx_thing -> origin/totally_bogus

코드에서 알 수 있듯이, 이 문제의 열쇠는 git config에서 데이터를 추출하는 것입니다.그냥 sed를 사용해서 외부 데이터를 지웁니다.

#!/bin/sh

current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
  sed -e "s/^.* //" -e "s/refs\/.*\///")

echo "$current_branch -> $remote/$remote_branch"

언급URL : https://stackoverflow.com/questions/4950725/how-can-i-see-which-git-branches-are-tracking-which-remote-upstream-branch

반응형