প্রদত্ত দূরবর্তী সংগ্রহস্থলে রিমোট শাখা রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


108

একটি নির্দিষ্ট শাখার জন্য আমার একটি সাবট্রি মার্জ করতে হবে, যদি এটি প্রদত্ত দূরবর্তী সংগ্রহস্থলে উপস্থিত থাকে। সমস্যাটি হ'ল দূরবর্তী সংগ্রহস্থলটি স্থানীয়ভাবে চেক আউট হয় না, তাই আমি ব্যবহার করতে পারি না git branch -r। আমার কাছে সমস্তই একটি প্রত্যন্ত ঠিকানা, এরকম কিছু https://github.com/project-name/project-name.git। দূরবর্তী ঠিকানার দ্বারা দূরবর্তী শাখাগুলি তালিকাভুক্ত করার কোনও উপায় আছে? আমি দরকারী কিছুই খুঁজে পাচ্ছি না :(

উত্তর:


127
$ git ls-remote --heads git@github.com:user/repo.git branch-name

ক্ষেত্রে branch-nameযদি পাওয়া যায় আপনি নিম্নলিখিত আউটপুট পাবেন:

b523c9000c4df1afbd8371324083fef218669108        refs/heads/branch-name

অন্যথায় কোনও আউটপুট প্রেরণ করা হবে না।

তাই এটির জন্য পাইপ দেওয়া wcআপনাকে দেবে 1বা 0:

$ git ls-remote --heads git@github.com:user/repo.git branch-name | wc -l

বিকল্পভাবে আপনি --exit-codeপতাকা সেট করতে পারেন git ls-remoteযার উপরে 2কোনও মিল নেই এমন রেফগুলি পাওয়া না গেলে প্রস্থান কোডটি ফেরত পাঠাবে। এটি সর্বাধিক প্রতিমা সমাধান। ফলাফলটি সরাসরি শেল পরীক্ষায় বা স্থিতি ভেরিয়েবল চেক করে পরীক্ষা করা যায় $?

$ git ls-remote --exit-code --heads  git@github.com:user/repo.git branch-name

8
আমি git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/nullঅনুসরণ করেছিif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
সিবাজ

4
আমি এই পরিষ্কার এবং সুনির্দিষ্ট উত্তরটি কয়েক ঘন্টা সন্ধান করছিলাম, উজ্জ্বল।
মেডিকান

আপনার হিসাবে শাখার নাম উল্লেখ করা দরকার /refs/heads/branch-name। অন্যথায়, শাখা foo/branch-nameনা থাকলেও ফিরে আসবে branch-name
ফিজি

আপনার 'দুর্দান্ত উত্তর' সোনার ব্যাজ অভিনন্দন। :)
jmort253

4
দ্রষ্টব্য: আপনি যদি রেপো ইউআরএল নির্দিষ্ট করতে না চান তবে আপনি এর পরিবর্তে রেপো রিমোট নামটি নির্দিষ্ট করতে পারেন: উদাহরণস্বরূপ:git ls-remote --heads origin branch-name
ড্যাভারুইইনসভারিথিং

50
git ls-remote --heads https://github.com/rails/rails.git
5b3f7563ae1b4a7160fda7fe34240d40c5777dcd    refs/heads/1-2-stable
81d828a14c82b882e31612431a56f830bdc1076f    refs/heads/2-0-stable
b5d759fd2848146f7ee7a4c1b1a4be39e2f1a2bc    refs/heads/2-1-stable
c6cb5a5ab00ac9e857e5b2757d2bce6a5ad14b32    refs/heads/2-2-stable
e0774e47302a907319ed974ccf59b8b54d32bbde    refs/heads/2-3-stable
13ad87971cc16ebc5c286b484821e2cb0fc3e3b1    refs/heads/3-0-stable
3df6c73f9edb3a99f0d51d827ef13a439f31743a    refs/heads/3-1-stable
f4db3d72ea564c77d5a689b850751ce510500585    refs/heads/compressor
c5a809e29e9213102351def7e791c3a8a67d7371    refs/heads/deps_refactor
821e15e5f2d9ef2aa43918a16cbd00f40c221e95    refs/heads/encoding
8f57bf207ff4f28fa8da4544ebc573007b65439d    refs/heads/master
c796d695909c8632b4074b7af69a1ef46c68289a    refs/heads/sass-cleanup
afd7140b66e7cb32e1be58d9e44489e6bcbde0dc    refs/heads/serializers

আমি এলএস-রিমোট সম্পর্কেও জানতাম না। ধন্যবাদ!
প্রখর

7
আমাকে বাশ স্ক্রিপ্টে একটি পরীক্ষা করার দরকার ছিল এবং তাই কেবলমাত্র প্রস্থান কোডটিতে সত্যই আগ্রহী ছিলাম, তাই আমি স্থানীয় ক্লোনটিতে নিম্নলিখিতটি করলাম: git ls-remote --exit-code . origin/branch-name &> /dev/nullতারপরে $?পরীক্ষার অপারেন্ড হিসাবে ব্যবহৃত হয়েছিল
ড্যারেন বিশপ

5
@ ড্যারেন, কেবলমাত্র শর্তসাপেক্ষে সরাসরি কমান্ডটি ব্যবহার করে if git ls-remote ...; then ...; fiচেক করার চেয়ে ত্রুটি-প্রবণতা কম $?(যা লগিং স্টেটমেন্ট, ট্র্যাপ ইত্যাদির মাধ্যমে পরিবর্তন করা যেতে পারে)।
চার্লস ডাফি

কেন --heads?
স্টিভ

@ জনলিনাক্স --headsকেবল শাখা তালিকাভুক্ত করে। --tagsশুধুমাত্র ট্যাগ তালিকা করতে ব্যবহার করুন ।
rymo

19

চালানোর জন্য গিট রেপো যদি আপনি বর্তমান ফোল্ডারে ব্যবহার করতে পারেন তবে অন্য উপায়

git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'

4
ডাবল উক্তি ব্যবহার করুন:git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
ইভান

4
এটি সর্বোত্তম নয় কারণ এটি যদি আপনি কেবল একটি বিদ্যমান শাখার অংশের সাথে মেলে, তবে লক্ষ্য শাখার সাথে ঠিক মেলে না তবে এটি সত্য হবে। সুতরাং শাখাটি পরীক্ষা করে দেখার আগে যদি এটি উপস্থিত থাকে তবে পরীক্ষার জন্য এটি কোনও স্ক্রিপ্টে নিরাপদে ব্যবহার করা যাবে না। যাইহোক যাইহোক ভাগ করে নেওয়ার জন্য ধন্যবাদ, কারণ আমি এটি দরকারী বলে মনে করি। git branch -a | grep "\b${BRANCH}$"
এটির

4
git fetchgit branch -aসমস্ত রিমোট রেফ ব্যবহার করে প্রথমে আনার প্রয়োজন হয়। git ls-remoteঅন্যদের দ্বারা চিহ্নিত হিসাবে অন্য ব্যবহার ।
hIpPy

git branch -a --list '<pattern>'এছাড়াও একটি বিকল্প। আপনার স্ক্রিপ্টের জন্য যদি কোনও রিটার্ন কোড দরকার হয় তবে গ্রেপ করতে পাইপ।
LOAS

16

আপনি এটি ব্যবহার করতে পারেন:

git show-branch remotes/origin/<<remote-branch-name>>

সর্বশেষ প্রতিশ্রুতি এবং $ এর মান প্রদান করে? 0 অন্যথায় কি "মারাত্মক: খারাপ sha1 রেফারেন্স রিমোটগুলি / উত্স </>" এবং $ এর মান প্রদান করে? 128 হয়


4
এটি চেক করার আগে দূরবর্তী থেকে শাখাগুলি টানবে না, যাতে আপনি সর্বশেষতম দূরবর্তী অবস্থা পান না।
সিম্যানকো

14

এখানে সমস্ত উত্তর লিনাক্স শেল-নির্দিষ্ট, যা আপনি যদি এমন পরিবেশে থাকেন যা এই ধরণের অপারেশনগুলিকে সমর্থন করে না - তবে খুব বেশি সহায়তা করে না - উদাহরণস্বরূপ, উইন্ডোজ কমান্ড প্রম্পট।

ভাগ্যক্রমে git ls-remoteএকটি --exit-codeযুক্তি গ্রহণ করে যা যথাক্রমে শাখার উপস্থিতি রয়েছে কি না তার উপর নির্ভর করে 0 বা 2 প্রত্যাবর্তন করে। সুতরাং:

git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>

0, এবং ফিরে আসবে

git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>

2 ফিরে আসবে।

পাওয়ারশেলের জন্য, আপনি কেবল বিল্ট-ইন ট্রুয়েন্সি হ্যান্ডলিং শব্দার্থক ব্যবহার করতে পারেন:

if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }

ফলন $true, যখন:

if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }

ফলন $false


12

তারপরে প্রতিবার ম্যানুয়ালি সংগ্রহের নামটি পাস করার দরকার নেই।

git ls-remote origin <branch>

পরিবর্তে

git ls-remote <full repo url> <branch>

উদাহরণ:

git ls-remote git@bitbucket.org:landmarkgroupme/in-store-application.git  uat_21dec

বা

git ls-remote origin uat_21dec

উভয়ই একই আউটপুট দেবে:

এখানে চিত্র বর্ণনা লিখুন

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


11

বাশ টার্মিনালে আপনি এরকম কিছু করতে পারেন। আপনি যে কমান্ডগুলি সম্পাদন করতে চান তার সাথে ইকোগুলি প্রতিস্থাপন করুন।

if git ls-remote https://username:password@github.com/project-name/project-name.git | grep -sw "remote_branch_name" 2>&1>/dev/null; then echo "IT EXISTS..START MERGE" ; else echo "NOT FOUND" ; fi

আশা করি এটা সাহায্য করবে.


4
আমি এটা পছন্দ করি. অন্যের উত্তরগুলিরও এলএস-রিমোট থাকে, আমি যা পছন্দ করি তা হল "যদি" "
স্টনি

6
$ git ls-remote --heads origin <branch> | wc -l

বেশিরভাগ সময় কাজ করে।

শাখাটি নীচের মতো আংশিকভাবে মেলে তবে কাজ করবে না,

$ git branch -a
creative/dev
qa/dev

$ git ls-remote --heads origin dev | wc -l
2

ব্যবহার

git ls-remote --heads origin <branch> | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^<branch>$ | wc -l

আপনি যদি একটি নির্ভরযোগ্য উপায় চান।

আপনি যদি স্ক্রিপ্টে ব্যবহার করতে চান এবং originডিফল্ট রিমোট হিসাবে ধরে নিতে চান না

git ls-remote --heads $(git remote | head -1) "$branch" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^"$branch"$ | wc -l

কাজ করা উচিত.

দ্রষ্টব্য যে git branch -a | grep ...এটি নির্ভরযোগ্য নয় কারণ এটি শেষ fetchহওয়ার পরে কিছুক্ষণ হতে পারে ।


আমার জন্য এটি অমিতেশ (সংক্ষিপ্ত দূরবর্তী নাম) এর সাথে মিলিত জেমস ক্যাশের ( grep -x "$branch"একইরকম grep ^"$branch"$) এর উত্তরটির সাথে মিলিত স্বীকৃত উত্তর । যদিও স্ক্রিপ্ট আমি পছন্দ দীর্ঘ রুপের পরিবর্তন: --line-regexp। এছাড়াও, করার দরকার নেই wc -l। বাশের খালি খালি আউটপুটটি if [ -z ] কার্যকরভাবে কার্যকর হিসাবে মূল্যায়ন করে যাতে এর মানে হল যে শাখার অস্তিত্ব নেই। এটি আপনাকে কয়েক মিলিসেকেন্ড বাঁচায়।
আমেদী ভ্যান গ্যাস

1

রিমোট ব্যবহার করে আপনার কাছে থাকা সংগ্রহস্থল যুক্ত করতে পারেন git remote add something https://github.com/project-name/project-name.gitএবং তারপরে রিমোট সম্পর্কিত git remote show somethingসমস্ত তথ্য পেতে একটি করতে পারেন। এর জন্য একটি নেটওয়ার্ক সংযোগ প্রয়োজন এবং মানব ব্যবহারের জন্য দরকারী।

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

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


ব্যাখ্যার জন্য ধন্যবাদ। আমি এখনও কৌতুক করতে অভ্যস্ত হইনি এবং এর জন্য বিভিন্ন ধরণের চিন্তাভাবনা প্রয়োজন require
প্রখর

1

আপনি চেষ্টা করতে পারেন

git diff --quiet @{u} @{0}

এখানে @{u}প্রত্যন্ত / উজান @{0}প্রবাহকে বোঝায় এবং বর্তমান স্থানীয় হেডকে বোঝায় (গিটের আরও নতুন সংস্করণ সহ, @{0}সংক্ষিপ্ত করা যেতে পারে@ )। যদি রিমোটের অস্তিত্ব না থাকে তবে এটি ত্রুটিযুক্ত হয়ে যায়।

গিট 2.16.2 দিয়ে (আমি নিশ্চিত নই যে কোন সংস্করণে প্রথম এই কার্যকারিতাটি রয়েছে, উদাহরণস্বরূপ, গিট 1.7.1 এর এটি নেই) আপনি করতে পারেন

git checkout

যদি কোনও দূরবর্তী শাখা উপস্থিত থাকে তবে কিছু আউটপুট আসবে, যেমন

Your branch is up to date with 'origin/master'

অন্যথায় কোনও আউটপুট নেই।


1

নামের মধ্যে কোয়েরি থাকা সমস্ত শাখা (দূরবর্তী বা স্থানীয়) ফিরিয়ে দেবে।

git branch --all | grep <query>


0

যদি আপনার শাখার নামগুলি খুব নির্দিষ্ট হয় তবে সাধারণ শাখার নাম মিলে যাওয়ার জন্য আপনার গ্রেপ ব্যবহার করার প্রয়োজন নেই:

git ls-remote --heads $(git remote | head -1) "*${BRANCH_NAME}*" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    wc -l

যা জন্য কাজ করে

BRANCH=master
BRANCH=mas
BRANCH=NonExistingBranch (returns 0)
BRANCH=ISSUE-123

আমরা শাখার নাম হিসাবে অনন্য ইস্যু আইডি ব্যবহার করি এবং এটি দুর্দান্ত কাজ করে।


0

আমি কেবল এটি চেষ্টা করেছি:

git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l

যদি "আপনার-শাখা" শাখাটি পাওয়া যায় এবং অন্যথায় 0 হয় তবে এটি 1 ফিরে আসবে।


0

আমি উপরের কয়েকটি উত্তর একটি স্ক্রিপ্টে সংযুক্ত করছি:

BRANCHES=(develop master 7.0 7.0-master)
ORIGIN=bitbucket
REMOTE=github

for BRANCH in "${BRANCHES[@]}"; do
  BRANCH=$(git ls-remote --heads "${ORIGIN}" "${BRANCH}" \
      | cut --delimiter=$'\t' --fields=2 \
      | sed 's,refs/heads/,,' \
      | grep --line-regexp "${BRANCH}")
  if [ -n "${BRANCH}" ]
  then
    git branch --force "${BRANCH}" "${ORIGIN}"/"${BRANCH}"
    git checkout "${BRANCH}"
    git push "${REMOTE}" "${BRANCH}"
  fi
done

git push github --tags

এই স্ক্রিপ্টটি একটি রিমোট বিটবাকেট থেকে 4 টি শাখা পাবে এবং এগুলি একটি দূরবর্তী গিথুবে চাপ দেবে এবং তারপরে সমস্ত ট্যাগগুলিকে গিথুবে চাপ দেবে। আমি এটিকে জেনকিন্স চাকরিতে ব্যবহার করছি, এজন্য আপনি কোনওটি দেখতে পাচ্ছেন না git fetchবাgit pull এটি ইতিমধ্যে জেনকিন্স জব রিপোজিটরি কনফিগারেশনে সম্পন্ন হয়েছে।

আমি সাধারণত স্ক্রিপ্টগুলিতে দীর্ঘ-ফর্ম বিকল্প পছন্দ করি। আমি একত্রিত git branchএবং git checkoutব্যবহার করে করতে পারে git checkout -B

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