কোন গিট শাখাগুলি কোন দূরবর্তী / প্রবাহ শাখা ট্র্যাক করছে তা আমি কীভাবে দেখতে পারি?


824

আমি জানি যে আমি করতে পারি git branch --all, এবং এটি আমাকে স্থানীয় এবং দূরবর্তী উভয় শাখা দেখায়, তবে তাদের মধ্যকার সম্পর্কগুলি দেখানোর ক্ষেত্রে এটি তেমন কার্যকর নয়।

আমি কীভাবে শাখাগুলি এমনভাবে তালিকাবদ্ধ করব যা দেখায় যে কোন স্থানীয় শাখা কোন দূরবর্তীটিকে ট্র্যাক করছে?

উত্তর:


1142

খুব বেশি চীনামাটির বাসন কমান্ড, স্ক্রিপ্টিংয়ের জন্য আপনি এটি চাইলে ভাল না:

git branch -vv   # doubly verbose!

নোট করুন যে গিট ১.৮.৩ এর সাথে, উজানের শাখাটি নীল রঙে প্রদর্শিত হবে (দেখুন " এই শাখাটি ট্র্যাকিং কী (যদি কিছু আছে) গিটে কি? ")


আপনি যদি পরিষ্কার আউটপুট চান, তবে আর্ক্রেসুর উত্তর দেখুন - এটি একটি পোরসিলাইন কমান্ড ব্যবহার করে যা আমি বিশ্বাস করি না যে আমি এই উত্তরটি লেখার সময় উপস্থিত ছিলাম, সুতরাং এটি কিছুটা আরও সংক্ষিপ্ত এবং কেবল মার্জ না হয়ে রিবেসের জন্য কনফিগার করা শাখাগুলির সাথে কাজ করে।


3
উপরের প্রথম পদ্ধতিটি আমার জন্য পছন্দসই তথ্য সরবরাহ করে না। দ্বিতীয়টি ... কুবীর উত্তর কাজ করার পরে, অতিমাত্রায় মনে হচ্ছে sp আমি কিছু অনুপস্থিত করছি?
গ্যারিপ

3
@garyp আপনি যে প্রশ্নটি জিজ্ঞাসা করেছেন তিনি নন। প্রথমটি ওপি-র যা প্রয়োজন তা সরবরাহ করেছিল এবং দ্বিতীয়টি তার প্রয়োজন মতো ঠিক কী সরবরাহ করেছিল , যদি স্ক্রিপ্টিংয়ের জন্য তিনি এটি পরিষ্কার ফর্মে চান বা এটি কেবল একটি উপনাম হিসাবে সংরক্ষণ করতে চান। ("ওভারকিল" ঠিক আছে যদি এটি আপনি যা চান তা পেয়ে যান এবং আপনাকে এটি পুনরাবৃত্তি করতে হবে না)) এই প্রশ্নের দৃষ্টিকোণ থেকে কুবির উত্তরটি কিছু বহির্মুখী তথ্য সরবরাহ করে এবং যদি একাধিক দূরবর্তী থাকে তবে তা কার্যকর হয় না সব কিছু দেখায় না, তবে এটি যদি আপনার চাহিদা পূরণ করে তবে তা সর্বদা ব্যবহার করুন।
ক্যাসাবেল

2
আমি ক্ষমা চাই। আমি যখন প্রথম পদ্ধতিটি চালিয়েছিলাম তখন কী কী ট্র্যাক করে সে সম্পর্কে আমি কোনও তথ্য পাইনি এবং আমার তা স্পষ্টভাবে বলা উচিত ছিল। তবে এখন আমি ট্র্যাকিংয়ের তথ্যটি দেখতে পাচ্ছি, সুতরাং আমার সেটআপটিতে আমার অবশ্যই কিছু ভুল হয়েছে। তাই আমি কিছু অনুপস্থিত ছিল
গ্যারিপ

2
FWIW আমি বিভ্রান্ত হয়ে পড়েছিলাম কারণ -v এবং -vv একই ধরণের আউটপুট দেখায়। ট্র্যাক করা শাখাটি হ্যাশের পরে এবং সাম্প্রতিক কমিটের আগে (আমার ডিফল্ট ওএসএক্স হোমব্রু ইনস্টল করার আগে) বর্গাকার বন্ধনীগুলিতে দেখানো হয়েছে।
জার্কার্ক

3
এগুলি আমার জন্য সর্বশেষ প্রতিশ্রুতিবদ্ধ হ্যাশ প্রিন্ট আউট এবং প্রতিটি শাখার জন্য মন্তব্য।
ক্যাপিবারালেট

263

git remote show origin

আপনার রিমোটটির নাম যাই হোক না কেন তার সাথে 'উত্স' প্রতিস্থাপন করুন।


11
যদিও এই চীনামাটির কমান্ড কিন্ডা মানুষের জন্য কাজ করে (কোনও স্ক্রিপ্টের জন্য এতটা নয়, যেমন এটি চীনামাটির আউটপুট বিশ্লেষণ করতে হবে), আমি এই পদ্ধতির সম্পর্কে যা পছন্দ করি না তা হ'ল git remote showকমান্ডটি আসলে রিমোট রেপোতে সংযুক্ত ... এবং তাই এটি ব্যর্থ হয় যদি আপনি অফ-লাইন হয়ে থাকেন বা যে কোনও কারণেই
রেপোতে

17
@pvandenberk আপনি git remote show -n originঅফলাইনে থাকা অবস্থায়ও কিছু তথ্য পেতে ব্যবহার করতে পারেন । থেকে Git দূরবর্তী ডকুমেন্টেশন : "-n বিকল্প, দূরবর্তী মাথা Git LS-দূরবর্তী সঙ্গে প্রথম জানতে চাওয়া নেই <নাম>; ক্যাশে তথ্য পরিবর্তে ব্যবহার করা হয়।"
সেররান

5
এই কমান্ডটি সম্পর্কে একটি অদ্ভুত বিষয়: এটি দূরবর্তী শাখাগুলিকে "ট্র্যাকড" হিসাবে তালিকাভুক্ত করে, এমনকি যদি টান / পুশের জন্য কোনও স্থানীয় শাখা কনফিগার করা থাকে না। আমি সবসময় এই বিভ্রান্তি খুঁজে। এই আউটপুটটিতে "ট্র্যাকড" বলতে কী বোঝার কথা তা আমি আসলে পরিষ্কার করছি না। বিষয়টির গিট ডকগুলি এটিকে শব্দ করে তোলে যেমন কোনও দূরবর্তী শাখাকে "ট্র্যাক" করা হয় কেবল যখন এটি কোনও স্থানীয় শাখাকে পুশ / টানার জন্য যুক্ত / আবদ্ধ করা হয় ...
হককি পার্কার

সমস্যাটি হ'ল আমি আসলে যা খুঁজছি তা না পাওয়া পর্যন্ত আমাকে সমস্ত দূরবর্তী নামের জন্য এই কল করা দরকার।
jolvi

2
@ জোলভি আপনি git remote show | xargs git remote show -nসমস্ত রিমোটের জন্য সম্মিলিত ট্র্যাকিং তথ্য দেখতে দৌড়াতে পারেন।
Synoli

107

আপনি যদি ম্যান পেজটির দিকে তাকান 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
# ...

এটি রেফগুলি পার্সিং ও ম্যানুয়ালি কনফিগার করার চেয়ে পরিষ্কার।


আমি সন্ধান করার পরেও রেট-পার্সে বিটটি বুঝতে পারি না, সুতরাং স্পষ্ট ব্যাখ্যাটির জন্য ধন্যবাদ!
অ্যালিস পুরসেল

3
"ফিচার / ব্লাহব্লাহ" নামে পরিচিত শাখাগুলি সহ আমরা যারা গিট-ফ্লো ব্যবহার করছেন তাদের জন্য, লুপটির সমাপনী বিবৃতিটি পড়তে হবে: গ্লোব প্যাটার্নের শেষে দুটি নক্ষত্রগুলি done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)নোট করুন ।
বিপণনকারী

2
git rev-parse --abbrev-ref HEAD@{upstream}বর্তমান শাখার জন্য সুন্দরভাবে কাজ করছে বলে মনে হচ্ছে। এটি একটি দুর্দান্ত গিট ওরফেও তৈরি করে।
দিঘিকাটা

whileলুপ সিনট্যাক্স একটু আমাকে অদ্ভুত দেখায়। আপনি কেবল এটি ব্যবহার করতে পারেন git for-each-ref ... | while read branch; do ...যা কোনও ফিফোর প্রয়োজন হয় না এবং লিখিত কমান্ডগুলির মতো একই ক্রমে চালিত হয়।
ড্যানিয়েল বোহ্মার

কমপক্ষে গিট 2.5.1 এর পরে থেকে, আপনার কাছে একটি লাইন রয়েছেgit for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
ম্যাট এম

81

কুবির উত্তরের বিকল্পটি হ'ল .git/configফাইলটিতে নজর রাখা যা স্থানীয় সংগ্রহস্থল কনফিগারেশনটি দেখায়:

cat .git/config


6
এছাড়াও git config --get-regex branch
তামির ড্যানিয়েলি

6
বা আরও সুনির্দিষ্টভাবে বলা যায়, 'গিট কনফিগারেশন --get-regexp শাখা। * মার্জ করুন
yoyo

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

প্রতিটি স্থানীয় শাখার জন্য একটি লাইন প্রদর্শন করবে। একটি ট্র্যাকিং শাখা দেখতে পাবেন:

master <- origin/master

অ-ট্র্যাকিংয়ের মতো দেখতে পাবেন:

test <- 

ভাল, কিছু অর্ডারিং এবং ট্যাব-বেড আউটপুট যুক্ত করতে: গিটের জন্য-প্রতিটি-রেফ - সার্ট আপস্ট্রিম - ফর্ম্যাট = '% (পুনঃনামকরণ: সংক্ষিপ্ত)% 09 <-% (প্রবাহ: সংক্ষিপ্ত)'
রেফ

সুন্দরভাবে সংক্ষিপ্ত এবং আউটপুট আসলে গ্রহণযোগ্য চেয়ে অনেক বেশি পঠনযোগ্য git branch -vv। 🙏
জোকি

একমাত্র সমস্যাটি হ'ল আমি এটি মনে করতে পারি না, তাই আমি ব্যবহার করেছিgit config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
জোকি

38

বর্তমান শাখার জন্য এখানে দুটি ভাল পছন্দ রয়েছে:

% 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

এই উত্তরটি এখানেও রয়েছে , কিছুটা আলাদা প্রশ্নের যা (ভুলভাবে) সদৃশ হিসাবে চিহ্নিত হয়েছিল।


5
যে উপর ভিত্তি করে, সব শাখা একটি স্ক্রিপ্ট বন্ধুত্বপূর্ণ ফ্যাশন তালিকাভুক্ত করা যাবে: git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads
ড্যানিয়েল জেমস

15

বর্তমান শাখার জন্য, আপনি বলতে পারেন git checkout(ডাব্লু / ও যে কোনও শাখা)। বর্তমান শাখার জন্য ট্র্যাকিংয়ের তথ্য উপস্থিত থাকলে, উপস্থিত দেখানোর জন্য এটি কোনও পার্শ্ব-প্রতিক্রিয়াযুক্ত no

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

পর্যাপ্ত পরিমাণে, তবে আপনি দুর্ঘটনাক্রমে টাইপ করতে পারেন git checkout ., এটি কোনও কোনও বিকল্প নয়।
টমাসজ গ্যান্ডার

6

আমি এই উপনামটি ব্যবহার করি

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

5
আমি মনে করি যে দুটি পরামিতি সহ আপনার কমান্ড একটি ট্র্যাক শাখা কনফিগার করেছে worth
আলবফান

3

অলিভিয়ার রেফালোর জবাবের ভিত্তিতে

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

এটি ট্র্যাক কনফিগার করা সহ কেবল স্থানীয় দেখায়।

এটিকে আপনার পথে গিট-ট্র্যাক নামে একটি স্ক্রিপ্টে লিখুন এটি একটি গিট ট্র্যাক কমান্ড পাবে

Https://github.com/albfan/git-showupstream এ আরও বিস্তৃত সংস্করণ


1

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

ট্র্যাক করা দূরবর্তীটির নাম দিবে

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

ট্র্যাক করা দূরবর্তী শাখার নাম আপনাকে দেবে।

আপনাকে আপনার বর্তমান শাখার নামের সাথে $ বর্তমান_ব্রঞ্চটি প্রতিস্থাপন করতে হবে। আপনি গতিশীলভাবে এটি পেতে পারেন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

আপনি কোডটিতে দেখতে পাচ্ছেন এটির কীটি গিট কনফিগারেশন থেকে ডেটা উত্তোলন করছে। আমি কেবল বহিরাগত ডেটা সাফ করার জন্য সেড ব্যবহার করি।

#!/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"

1

এখানে একটি পরিষ্কার এবং সহজ একটি। চেক করতে পারে git remote -v, যা আপনাকে বর্তমান শাখার উত্স এবং প্রবাহ দেখায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.