답변:
스크립팅을 위해 원하는 경우 매우 많은 도자기 명령입니다.
git branch -vv # doubly verbose!
git 1.8.3에서는 업스트림 분기가 파란색 으로 표시됩니다 ( " git에서 분기 추적 (있는 경우)은 무엇입니까? "참조).
깨끗한 출력을 원하면 arcresu의 답변을 참조하십시오 .이 답변 은 원래이 답변을 작성한 시점에 존재하지 않았다고 생각되는 도자기 명령을 사용하므로 조금 더 간결하고 병합뿐만 아니라 rebase를 위해 구성된 분기와 함께 작동합니다.
git remote show origin
'원점'을 리모컨의 이름으로 바꾸십시오.
git remote show
명령이 실제로 원격 저장소에 연결된다는 것입니다 ... 따라서 어떤 이유로 든
git remote show | xargs git remote show -n
모든 리모컨에 대한 통합 추적 정보를보기 위해 실행할 수 있습니다.
에 대한 매뉴얼 페이지를 보면 git-rev-parse
다음 구문이 설명되어 있습니다.
<branchname>@{upstream}
예를 들면master@{upstream}
,@{u}
@{upstream}
branchname 의 접미사 (약식<branchname>@{u}
)는 branchname으로 지정된 분기가 빌드되도록 설정된 분기를 나타냅니다. 누락 된 분기 이름은 기본적으로 현재 이름입니다.
따라서 지점의 상류를 찾으려면 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와 config를 수동으로 파싱하는 것보다 깨끗합니다.
done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)
참고 두 글로브 패턴의 끝에 별표.
git rev-parse --abbrev-ref HEAD@{upstream}
현재 지점에서 잘 작동하는 것 같습니다. 또한 멋진 자식 별칭을 만듭니다.
while
루프 구문은 나에게 조금 이상한 보인다. git for-each-ref ... | while read branch; do ...
FIFO가 필요하지 않고 작성된 명령과 동일한 순서로 실행되는 것을 사용할 수 있습니다 .
git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
kubi의 대답에 대한 대안 .git/config
은 로컬 저장소 구성을 보여주는 파일을 보는 것입니다 .
cat .git/config
git config --get-regex branch
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
각 지역 지점에 대한 라인을 표시합니다. 추적 지점은 다음과 같습니다.
master <- origin/master
추적하지 않는 것은 다음과 같습니다.
test <-
git branch -vv
. 🙏
git config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
를 들어 현재의 지점, 여기에 두 가지 좋은 선택이 있습니다 :
% 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 for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads
.
현재 지점의 경우 git checkout
(아무 지점도 없음) 이라고 말할 수도 있습니다 . 이것은 현재 브랜치에 대한 추적 정보가있는 경우 부작용을 나타내는 no-op입니다.
$ git checkout
Your branch is up-to-date with 'origin/master'.
git checkout .
.
이 별칭을 사용합니다
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"