जवाबों:
यदि आप स्क्रिप्टिंग के लिए यह चाहते हैं तो बहुत कम चीनी मिट्टी के बरतन आदेश, अच्छा नहीं है:
git branch -vv # doubly verbose!
ध्यान दें कि git 1.8.3 के साथ, उस अपस्ट्रीम शाखा को नीले रंग में प्रदर्शित किया जाता है (देखें " यह शाखा ट्रैकिंग क्या है (यदि git में कुछ भी? ")
यदि आप साफ आउटपुट चाहते हैं, तो आर्करेसु के उत्तर को देखें - यह एक पोर्सिलेन कमांड का उपयोग करता है जो मुझे विश्वास नहीं है कि मैं मूल रूप से इस उत्तर को लिख रहा हूं, इसलिए यह थोड़ा अधिक संक्षिप्त है और केवल मर्ज नहीं, रीबेज के लिए कॉन्फ़िगर की गई शाखाओं के साथ काम करता है।
git remote show origin
जो भी आपके रिमोट का नाम है, उसके साथ 'मूल' को बदलें।
git remote show
कमांड वास्तव में रिमोट रेपो से जोड़ता है ... और इसलिए यह विफल हो जाता है यदि आप ऑफ-लाइन हो या किसी भी कारण से रेपो से जुड़ने में असमर्थ हों ...
git remote show -n origin
ऑफ़लाइन होने पर भी कुछ जानकारी प्राप्त करने के लिए उपयोग कर सकते हैं । से Git दूरस्थ प्रलेखन : "-n विकल्प के साथ, दूरदराज के सिर Git ls-दूरदराज के साथ पहली बार पूछे नहीं कर रहे हैं <name>; कैश की गई जानकारी के बजाय प्रयोग किया जाता है।"
git remote show | xargs git remote show -n
लिए संयुक्त ट्रैकिंग जानकारी देखने के लिए दौड़ सकते हैं ।
यदि आप इसके लिए मैन पेज 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
# ...
यह पार्सिंग रेफरी और मैन्युअल रूप से कॉन्फ़िगर करने की तुलना में क्लीनर है।
done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)
नोट करें ।
git rev-parse --abbrev-ref HEAD@{upstream}
वर्तमान शाखा के लिए अच्छी तरह से काम करने लगता है। यह एक अच्छे git उर्फ के लिए भी बनाता है।
while
पाश वाक्य रचना थोड़ा मुझे अजीब लग रहा है। आप बस उपयोग कर सकते हैं git for-each-ref ... | while read branch; do ...
जिसे फीफो की आवश्यकता नहीं है और उसी क्रम में चलता है जैसे कि लिखे गए आदेश।
git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
कुबी के उत्तर का एक विकल्प उस .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
(w / o किसी भी शाखा)। यह वर्तमान शाखा के लिए, यदि मौजूद है, तो ट्रैकिंग जानकारी दिखाने के लिए साइड-इफ़ेक्ट वाला एक नो-ऑप है।
$ 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
ओलिवियर रिफालो के जवाब के आधार पर
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"