"গিট টান - সমস্ত" কি আমার সমস্ত স্থানীয় শাখা আপডেট করতে পারে?


473

আমার প্রায়শই কমপক্ষে 3 টি দূরবর্তী শাখা থাকে: মাস্টার, মঞ্চায়ন এবং উত্পাদন। আমার কাছে 3 টি স্থানীয় শাখা রয়েছে যেগুলি সেই প্রত্যন্ত শাখাগুলি ট্র্যাক করে।

আমার সমস্ত স্থানীয় শাখা আপডেট করা ক্লান্তিকর:

git fetch --all
git rebase origin/master
git checkout staging
git rebase origin/staging
git checkout production
git rebase origin/production

আমি কেবল একটি "গিট পুল-সব" করতে সক্ষম হতে চাই, তবে আমি এটি কাজ করতে সক্ষম হইনি। মনে হয় এটি একটি "আনা - সমস্ত" করে, তারপরে বর্তমান কার্যকারী শাখাটি আপডেট করে (দ্রুত এগিয়ে নেওয়া বা সংহত) করা হয়, তবে অন্যান্য স্থানীয় শাখাগুলিতে নয়।

আমি এখনও স্থানীয়ভাবে প্রতিটি শাখায় স্যুইচ করে আপডেট করছি stuck


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

34
এটির সাথে ঝামেলার জন্য পরামর্শক সময়ে একটি রক্ষণশীল $ 300 ধরে, এই একক ইস্যুতে companies 77,৪76 of এর ভিউ কাউন্ট ব্যবহার করে সংস্থাগুলি cost 23,242,800 খরচ করেছে। এখন এই প্রশ্নটি stackoverflow.com/questions/179123/… এবং অন্যান্য সমস্ত বিবেচনা করুন । কি দারুন.
লুক পুপলেট

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

13
@ লুক্কুপ্লেট মার্কুরিয়ালের তুলনায় এসও-তে গিট নিয়ে প্রায় 9 ডলার প্রশ্ন রয়েছে এবং পূর্ববর্তী বেশিরভাগের মনে হয় "আমি কীভাবে গিটে <সহজ অপারেশন করব"? " এটি ইঙ্গিত দেয় যে গিটটি খারাপভাবে ডিজাইন করা হয়েছে, দুর্বল নথিভুক্ত, অযথা বা তিনটিই রয়েছে।
ইয়ান কেম্প

26
@ ইয়ানক্যাম্প আমি এসও এর জনসংখ্যার অজানা না জেনে দাবিটি করা নিরাপদ তা নিশ্চিত নই। যদি মার্চুরিয়ালটি এখানে সাধারণভাবে ব্যবহৃত না হয়, বা যদি এর ব্যবহারকারীরা অন্য ফোরামে এটি সম্পর্কে জিজ্ঞাসা করে তবে আমি একই ফলাফলটি দেখতে আশা করি। :) সমাবেশের তুলনায় জাভাস্ক্রিপ্টে cript 51 গুণ যত বেশি প্রশ্ন রয়েছে - তাই কেবল এই ধরণের মেট্রিকের সাহায্যে সরঞ্জামগুলি বিচার করা সর্বদা সঠিক হতে পারে না।
ড্যানশুমওয়ে

উত্তর:


188

আপনি যে আচরণের জন্য বর্ণনা করেছেন pull --allতা প্রত্যাশার মতো ঠিক যেমনটি দরকারী নয় তবে তা ঠিক। বিকল্পটি গিটটি আনার জন্য পাশ করা হয়েছে, যা কেবলমাত্র প্রয়োজনীয় একটি পরিবর্তে সমস্ত রিমোটগুলি থেকে সমস্ত রেফগুলি আনে; pullতারপরে উপযুক্ত একক শাখাটি মার্জ করে (বা আপনার ক্ষেত্রে, পুনর্বাসনা)।

আপনি যদি অন্য শাখাগুলি পরীক্ষা করে দেখতে চান তবে আপনাকে সেগুলি পরীক্ষা করে দেখতে হবে। এবং হ্যাঁ, মার্জ করার জন্য (এবং রিবেসিং) একেবারে একটি কাজের গাছের প্রয়োজন, তাই অন্য শাখাগুলি পরীক্ষা করে দেখে সেগুলি করা যায় না। আপনি যদি চান তবে আপনার বর্ণিত পদক্ষেপগুলি কোনও স্ক্রিপ্ট / ওরফে গুটিয়ে রাখতে পারেন, যদিও আমি কমান্ডের সাথে যোগ দেওয়ার পরামর্শ দিচ্ছি &&যাতে তাদের মধ্যে কোনওটি ব্যর্থ হয়, এটি লাঙলের চেষ্টা করবে না।


2
আপনি যদি উদাহরণ কমান্ড লাইন দেন তবে আমি ভোট দিয়ে যাব। গিথুব এ আমার সমস্যা আছে আমি ইউআই তে একটি শাখা তৈরি করেছি। শাখাটি দেখানোর জন্য এখন আমার স্থানীয় প্রয়োজন need গিট টান - সমস্ত; গিট শাখা ... আরগ ... কমান্ড: গিট শাখা -a
মেরিওটি

@Mariotti আপনি যা করার চেষ্টা করছেন তা নির্ভর করে এবং এটি আপনার মন্তব্য থেকে সত্যিই পরিষ্কার নয়। আপনি একটি নতুন প্রশ্ন জিজ্ঞাসা সেরা হতে পারে।
ক্যাসাবেল

1
বা @ জেফ্রমি .. একটি উদাহরণ দিন। আমি আসলে আপনার সাথে একমত ছিলাম।
মারিওত্তি

3
@મારીোট্টি এই উত্তরের মূল বিষয়টি হ'ল বিল্ট-ইন কমান্ডগুলি ওপি যা বলেছিল তা করে না, তাই তাদের যে পদক্ষেপ ছিল তার ক্রমটি প্রয়োজনীয়। এই পদক্ষেপগুলি স্বয়ংক্রিয় করা সম্ভব (উদাহরণস্বরূপ জন এর উত্তর দেখুন) তবে সেগুলি করা দরকার। সুতরাং আপনি যা করার চেষ্টা করছেন তা যদি ওপি-র মতো হয় তবে সত্যিই দেওয়ার উদাহরণ নেই এবং আপনি যদি অন্যরকম কিছু করার চেষ্টা করছেন তবে আপনার একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত - এটি স্ট্যাকওভারফ্লো কীভাবে কাজ করে! (এবং আপনার মন্তব্যটি অস্পষ্ট, তবে আমার সর্বোত্তম অনুমান যে আপনি এখানে ওপি থেকে আলাদা কিছু চান, তাই হ্যাঁ, নতুন প্রশ্ন))
ক্যাস্যাবেল

হ্যাঁ, কিছুটা আলাদা। তবে আপনার উত্তরটি প্রসঙ্গে উপযুক্ত। এবং কেবল আপনার উত্তরের কারণে আমার আর জিজ্ঞাসার দরকার নেই। জাস্ট: গৃহীত উত্তরটি গিট-আপ ব্যবহার করে, যা গিট কমান্ড লাইনের জন্য কেবল ইন্টারফেস (আমি ধরে নিই)। আমি আশা করছিলাম আপনি গিট কমান্ডের কয়েকটি লাইনে এটি স্পষ্ট করে তুলতে পারেন। বর্তমান উত্তরটি গিট নয়।
mariotti

206

আমি ব্যবহার syncsubcommand এর হাব এই স্বয়ংক্রিয়। আমার alias git=hubমধ্যে রয়েছে .bash_profile, তাই আমি যে কমান্ডটি টাইপ করি তা হ'ল:

git sync

এটি সমস্ত স্থানীয় শাখাগুলিকে আপডেট করে যার সাথে মেলে আপস্ট्रीम শাখা। ম্যান পৃষ্ঠা থেকে:

  • স্থানীয় শাখাটি যদি পুরানো হয় তবে দ্রুত-ফরোয়ার্ড করুন;
  • স্থানীয় শাখায় যদি চাপবিহীন কাজ থাকে তবে সে সম্পর্কে সতর্ক করুন;
  • যদি শাখাটি মার্জ হয়ে যায় এবং এর প্রবাহ শাখাটি মুছে ফেলা হয়, তবে এটি মুছুন।

এটি বর্তমান শাখায় অনাকাঙ্ক্ষিত পরিবর্তনগুলি স্ট্যাশিং / আনস্ট্যাশিং পরিচালনা করে।

আমি গিট-আপ নামক একটি অনুরূপ সরঞ্জাম ব্যবহার করতাম তবে এটি আর রক্ষণাবেক্ষণ করা হয় না এবং git syncপ্রায় একই জিনিসটি করে।


14
উইন্ডোজ সম্পর্কে কি?
ভায়োলেট জিরাফ

6
@ ট্রেন্টনডি.এডমস প্রতিশ্রুতিবদ্ধ তারিখ এবং লেখকের তারিখগুলি ভিন্ন ধারণা। একটি রিবেস কমিটের তারিখ পরিবর্তন করবে তবে লেখকের তারিখটি নয় (দ্বন্দ্বগুলি বাদে যেখানে লেখকের তারিখের পাশাপাশি পরিবর্তন হয়)। লেখকের তারিখ প্রতিবিম্বিত করে যে কমিটের গাছটি কখন রচনা করা হয়েছিল এবং কোনও অনিবন্ধিত রিবেসের সময় পরিবর্তন করা উচিত নয়। কমিটের তারিখ পরিবর্তিত হয় কারণ রিবেস সর্বদা একটি নতুন প্রতিশ্রুতি তৈরি করে। সুতরাং কমিটের তারিখগুলি সর্বদা সঠিক ক্রমে থাকবে।
দেব

16
গিট-আপের স্বয়ংক্রিয় রিবিসিং আচরণটি বন্ধ করতে, চালান git config --global git-up.rebase.auto false
ড্যান লোয়েনেহার্জ

17
@ ম্যাক্সইয়ানকভ ভাগ করে নেওয়া ইতিহাসকে ছাড় দেওয়া সাধারণত এড়ানো যায়, টানানোর সময় স্থানীয় কমিটকে অব্যাহতি দেওয়ার ক্ষেত্রে কোনও ভুল নেই।
দেব

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

39

আমি জানি এই প্রশ্নটি প্রায় 3 বছরের পুরানো, তবে আমি নিজেকে একই প্রশ্নটি জিজ্ঞাসা করেছি এবং কোনও প্রস্তুত সমাধানের সন্ধান পাইনি। সুতরাং, আমি আমার নিজের একটি কাস্টম গিট কমান্ড শেল স্ক্রিপ্ট তৈরি করেছি।

এখানে এটি যায়, git-ffwd-updateস্ক্রিপ্ট নিম্নলিখিতটি করে ...

  1. এটি git remote updateলেটগুলি রিভগুলি আনার জন্য একটি ইস্যু করে
  2. তারপরে git remote showস্থানীয় শাখাগুলির একটি তালিকা পেতে ব্যবহার করে যা প্রত্যন্ত শাখাকে ট্র্যাক করে (যেমন শাখাগুলি যা এর সাথে ব্যবহার করা যেতে পারে git pull)
  3. তারপরে এটি git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>স্থানীয় শাখা প্রত্যন্তের পিছনে (এবং বিপরীতে) কতজন প্রতিশ্রুতিবদ্ধ তা পরীক্ষা করে
  4. স্থানীয় শাখাটি যদি 1 বা তার বেশি সংস্থাগুলি এগিয়ে থাকে তবে তা দ্রুত অগ্রসর হতে পারে না এবং হাত দিয়ে মার্জ বা পুনর্বার প্রয়োজন
  5. স্থানীয় শাখাটি যদি 0 টি আগে এবং 1 বা আরও কমিট পিছনে কমিট করে তবে তা দ্রুত-ফরওয়ার্ড হতে পারে git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>

স্ক্রিপ্টটি এর মতো বলা যেতে পারে:

$ git ffwd-update
Fetching origin
 branch bigcouch was 10 commit(s) behind of origin/bigcouch. resetting local branch to remote
 branch develop was 3 commit(s) behind of origin/develop. resetting local branch to remote
 branch master is 6 commit(s) behind and 1 commit(s) ahead of origin/master. could not be fast-forwarded

সম্পূর্ণ স্ক্রিপ্টটি যেমন সংরক্ষণ করা উচিত git-ffwd-updateএবং তেমন হওয়া উচিত PATH

#!/bin/bash

main() {
  REMOTES="$@";
  if [ -z "$REMOTES" ]; then
    REMOTES=$(git remote);
  fi
  REMOTES=$(echo "$REMOTES" | xargs -n1 echo)
  CLB=$(git rev-parse --abbrev-ref HEAD);
  echo "$REMOTES" | while read REMOTE; do
    git remote update $REMOTE
    git remote show $REMOTE -n \
    | awk '/merges with remote/{print $5" "$1}' \
    | while read RB LB; do
      ARB="refs/remotes/$REMOTE/$RB";
      ALB="refs/heads/$LB";
      NBEHIND=$(( $(git rev-list --count $ALB..$ARB 2>/dev/null) +0));
      NAHEAD=$(( $(git rev-list --count $ARB..$ALB 2>/dev/null) +0));
      if [ "$NBEHIND" -gt 0 ]; then
        if [ "$NAHEAD" -gt 0 ]; then
          echo " branch $LB is $NBEHIND commit(s) behind and $NAHEAD commit(s) ahead of $REMOTE/$RB. could not be fast-forwarded";
        elif [ "$LB" = "$CLB" ]; then
          echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. fast-forward merge";
          git merge -q $ARB;
        else
          echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. resetting local branch to remote";
          git branch -f $LB -t $ARB >/dev/null;
        fi
      fi
    done
  done
}

main $@

1
এই স্ক্রিপ্ট জন্য আপনাকে ধন্যবাদ। এটা কি সম্ভব যে কেউ সেই স্ক্রিপ্টটিকে উইন্ডোজ ব্যাচে রূপান্তর করতে পারে?
সারিকো

@ সাড়িকো আপনি সাধারণ উইন্ডোজ শেলটিতে গিট ব্যবহার করতে চান না কেন? আপনি যদি সাইগউইনের মতো কিছু ব্যবহার করেন তবে এই স্ক্রিপ্টটি ঠিক কাজ করা উচিত ... (যদিও আমি এটি পরীক্ষা করি নি)
muhqu

@ রায়ানওয়িলকক্স ধন্যবাদ, আমি এটি প্রতিটি (কাজের) দিনের মতো ব্যবহার করছি ... ;-) আপনি আরও গিট সম্পর্কিত স্ক্রিপ্ট এবং উপকরণগুলির
muhqu

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

1
@muhqu নতুন গিট সংস্করণে, -t এবং -l একক git branchকলের মধ্যে একসাথে ব্যবহার করার কথা নয় । আমি কলটি পরিবর্তন করতে -l সরাল git branch -f $LB -t $ARB >/dev/null;এবং এখন স্ক্রিপ্টটি যেমনটি করা উচিত তেমন কাজ করে।
রাদেক লিসকা

24

স্বয়ংক্রিয়ভাবে চালানো এতটা কঠিন নয়:

#!/bin/sh
# Usage: fetchall.sh branch ...

set -x
git fetch --all
for branch in "$@"; do
    git checkout "$branch"      || exit 1
    git rebase "origin/$branch" || exit 1
done

4
স্ক্রিপ্টগুলিতে এলিয়াস না ব্যবহার করা ভাল। এটি আসলে কিছুই আনতে পারে না, কেবল ইতিমধ্যে প্রাপ্ত সামগ্রীগুলিতে রিবাস করে। আপনার এটিকে পরিবর্তন git rebase origin/$branchকরা উচিত git pull, যাতে এটি যথাযথ ট্র্যাকিং শাখা (সম্ভবত উত্স অনুসারে) থেকে এনে দেয় এবং কনফিগার দ্বারা নির্ধারিত হিসাবে একত্রিত হয়ে যায় বা পুনরায় সেট করা যায়।
ক্যাসকেবেল

@Jefromi: আমি ভুলে গিয়েছিলেন fetch। সম্পাদনা করেছেন; অতিরিক্ত বৈশিষ্ট্যগুলি / ওপি-র উপর নির্ভরযোগ্য সংশোধন।
ফ্রেড ফু

8
আমি এখনও মনে করি আপনি ব্যবহার করতে pull(বা চেক branch.<branch>.rebase) করতে চাইতে পারেন , যাতে আপনি দুর্ঘটনাক্রমে কোনও শাখা পুনরায় চালু না করেন যা সাধারণত টানা (মার্জ) করার জন্য স্থাপন করা হয়।
ক্যাসাবেল

1
প্রথম ত্রুটিতে দোভাষীকে প্রস্থান করার set -eপরিবর্তে ব্যবহার করার কথা বিবেচনা করুন || exit 1
ক্রিশোজ

18

এটি এখনও স্বয়ংক্রিয় নয়, যেমনটি আমি চাই যে এর জন্য কোনও বিকল্প ছিল - এবং এটি কেবল দ্রুত-অগ্রগতির আপডেটগুলির জন্যই ঘটতে পারে তা নিশ্চিত করার জন্য কিছু পরীক্ষা করা উচিত (যার কারণেই ম্যানুয়ালি একটি টান দেওয়া আরও নিরাপদ !!), তবে সাবধানতা অবলম্বন করে আপনি পারেন:

git fetch origin
git update-ref refs/heads/other-branch origin/other-branch

আপনার স্থানীয় শাখার অবস্থান যাচাই না করে আপডেট করতে।

দ্রষ্টব্য: আপনি আপনার বর্তমান শাখার অবস্থানটি হারাবেন এবং এটিকে উত্সের শাখাটি যেখানে নিয়ে যাবেন এর অর্থ হ'ল যদি আপনাকে মার্জ করার প্রয়োজন হয় তবে আপনি ডেটা হারাবেন!


1
ঠিক এটিই আমি সমাধান খুঁজছিলাম। আমার একাধিক শাখায় সাধারণত চাপ ছাড়ানো পরিবর্তন হয় না, এবং কেবল দূরবর্তীটি মেলানোর জন্য আমার বিভিন্ন স্থানীয় শাখা আপডেট করতে চাই। এই সমাধানটি আমার স্বাভাবিক মোছা / পুনরায় চেকআউট পদ্ধতির চেয়ে অনেক সুন্দর!
ডেভ নাইট

1
এক কমান্ডের সাথে মিলিত:git fetch origin other-branch:other-branch
ফেব্ব

12

এখানে প্রচুর উত্তর রয়েছে তবে git-fetchসরাসরি স্থানীয় রেফ আপডেট করতে ব্যবহার করা হয় নি , যা শাখাগুলি পরীক্ষা করার চেয়ে অনেক সহজ এবং এর চেয়ে নিরাপদ git-update-ref

এখানে আমরা git-fetchঅ-বর্তমান শাখাগুলি এবং বর্তমান শাখার জন্য আপডেট করতে ব্যবহার করি git pull --ff-only। এটা তোলে:

  • শাখা চেক আউট প্রয়োজন হয় না
  • শাখাগুলি আপডেট করুন কেবলমাত্র সেগুলি দ্রুত অগ্রসর করা যায়
  • যখন তাড়াতাড়ি এগিয়ে দেওয়া যায় না তখন রিপোর্ট করবে

এবং এটি এখানে:

#!/bin/bash
currentbranchref="$(git symbolic-ref HEAD 2>&-)"
git branch -r | grep -v ' -> ' | while read remotebranch
do
    # Split <remote>/<branch> into remote and branchref parts
    remote="${remotebranch%%/*}"
    branchref="refs/heads/${remotebranch#*/}"

    if [ "$branchref" == "$currentbranchref" ]
    then
        echo "Updating current branch $branchref from $remote..."
        git pull --ff-only
    else
        echo "Updating non-current ref $branchref from $remote..."
        git fetch "$remote" "$branchref:$branchref"
    fi
done

ম্যানপেজ থেকে এর জন্য git-fetch:

   <refspec>
       The format of a <refspec> parameter is an optional plus +, followed by the source ref <src>,
       followed by a colon :, followed by the destination ref <dst>.

       The remote ref that matches <src> is fetched, and if <dst> is not empty string, the local ref
       that matches it is fast-forwarded using <src>. If the optional plus + is used, the local ref is
       updated even if it does not result in a fast-forward update.

নির্দিষ্ট করে git fetch <remote> <ref>:<ref>(কোনও ছাড়াই +) আমরা একটি ফেচ পাই যা কেবলমাত্র স্থানীয় রেফারেন্স আপডেট করে যখন তা দ্রুত অগ্রসর করা যায়।

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


1
"শাখাগুলি দ্রুত অগ্রসর হতে পারে তবেই আপডেট করুন" - দ্রুত এগিয়ে যাওয়ার তাৎপর্য কী? আমি যদি আমার সমস্ত শাখায় সর্বশেষতম উত্স চাই তবে আমার কেন দ্রুত ফরওয়ার্ডিং করা উচিত? এর মতো জিনিসগুলি আমাকে গিট এবং এর ফ্যানবোইর জন্য হাসায়। আপনি কেবল একটি আদেশে এটি করতে পারবেন না। পরিবর্তে আপনাকে c*nপদক্ষেপগুলি সম্পাদন করতে হবে (1 এর পরিবর্তে), যেখানে cবারবার কমান্ডের কয়েকটি সংখ্যা রয়েছে এবং nএটি শাখার সংখ্যা।
jww

@jww যখন বিশ্বের সবচেয়ে ভিসিএস ব্যবহার করে তখন "গিট এবং এর ফ্যানবোইয়ের প্রতি হাসি" [sic] সাহায্য করে না। তবে আমি খনন করি ... আমি মনে করি এই ধরণের "গ্লোবাল পুল" স্ক্রিপ্টের প্রেক্ষাপটে এটি বিবিধ সংঘর্ষে বিযুক্ত হয়ে থাকলে অ-বর্তমান শাখাগুলিতে পরিবর্তন আনার চেষ্টা না করা বুদ্ধিমানের কাজ।
ভিল

এটি সহায়ক ছিল, আপনাকে ধন্যবাদ। আমি শুধু না মত এটি (বেশী যা আমি আগ্রহী নই সহ) প্রত্যেক দূরবর্তী শাখা জন্য স্থানীয়ভাবে একটি শাখা সৃষ্টি, তাই আমি পরিবর্তন করা হয়েছে করেনি git branch -r | grep -v ' -> ' | while read remotebranchথেকে git branch -r | grep -v ' -> ' | grep -f <(git branch | cut -c 3- | awk '{print "\\S*/"$0"$"}') | while read remotebranchশাখা আমি ইতিমধ্যে স্থানীয়ভাবে আছে তা সীমাবদ্ধ করতে। এছাড়াও আমি git fetch --pruneকিছু করার আগে দূরবর্তী শাখাগুলির তালিকা আপডেট করতে শুরুতে একটি যুক্ত করেছি , যা কিছু সতর্কতা এড়ায়।
নেট কুক

11

এই সমস্যাটি সমাধান করা হয়নি (এখনও), কমপক্ষে সহজেই / স্ক্রিপ্ট ছাড়াই নয়: জুনিয়ো সি হামানো পরিস্থিতি ব্যাখ্যা করে এবং একটি সহজ সমাধানের জন্য কল সরবরাহ করে গিট মেলিং তালিকায় এই পোস্টটি দেখুন ।

প্রধান যুক্তিটি হ'ল আপনার এটির প্রয়োজন হবে না:

গিটটি যা প্রাচীন নয় (যেমন v1.5.0 বা আরও নতুন), স্থানীয় "দেব" থাকার কোনও কারণ নেই যা বিশুদ্ধরূপে রিমোটটি ট্র্যাক করে। আপনি যদি কেবল দেখতে এবং দেখতে চান তবে আপনি সরাসরি " git checkout origin/dev" র সাহায্যে একটি বিচ্ছিন্ন হেডে দূরবর্তী ট্র্যাকিং শাখাটি পরীক্ষা করে দেখতে পারেন ।

যার অর্থ হ'ল কেবলমাত্র ব্যবহারকারীদের জন্য আমাদের সুবিধার্থ করার জন্য কেবলমাত্র সেই স্থানীয় শাখাগুলি পরিচালনা করা উচিত যখন আপনার স্থানীয় পরিবর্তন হয় বা আপনি যখন কিছু রাখার পরিকল্পনা করেন তখন দূরবর্তী বিষয়গুলি "ট্র্যাক" করে।

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

মূল পোস্টারের অনুরোধ মতো দ্রুত-ফরওয়ার্ডিংয়ের মাধ্যমে সেগুলি আপ টু ডেট রাখার পরিবর্তে স্থানীয় ব্রাঞ্চগুলিকে অনুসরণ করা দূরবর্তী ট্র্যাকিং শাখাগুলি ছাঁটাই করার জন্য কোনও বিকল্প বা বহিরাগত স্ক্রিপ্টের সমাধানের আহ্বান জানানো হয়েছিল।

সুতরাং git branch --prune --remote=<upstream>স্থানীয় শাখাগুলির উপরে যে " " পুনরাবৃত্তি হয় এবং কীভাবে

(1) এটি বর্তমান শাখা নয়; এবং
(2) <upstream> থেকে নেওয়া কিছু শাখা ট্র্যাক করে চিহ্নিত করা হয়েছে; এবং
(3) এর নিজস্ব কোনও প্রতিশ্রুতি নেই;

তাহলে সেই শাখাটি সরিয়ে ফেলবে? " git remote --prune-local-forks <upstream>" ঠিক আছে; কোন কমান্ডটি বৈশিষ্ট্যটি এত বেশি কার্যকর করে সে সম্পর্কে আমার কোনও চিন্তা নেই।

দ্রষ্টব্য: গিট ২.১০ হিসাবে এর মতো কোনও সমাধান নেই। দ্রষ্টব্য যেgit remote pruneসাবকম্যান্ডটি, এবংgit fetch --pruneশাখার জন্য রিমোট ট্র্যাকিং শাখা অপসারণের বিষয়ে যা দূরবর্তী স্থানে নেই, দূরবর্তী ট্র্যাকিং শাখা ট্র্যাক করে এমন স্থানীয় শাখা অপসারণ করার বিষয়ে নয় (যার জন্য দূরবর্তী ট্র্যাকিং শাখাটি উজানের শাখা)।


কেবল লিঙ্কগুলি পোস্ট করার পরিবর্তে দয়া করে লিঙ্কগুলি উল্লেখ হিসাবে ব্যবহার করে প্রকৃত সামগ্রী পোস্ট করুন। সেই লিঙ্কটি এখন মারা গেছে। খুব খারাপ, আশাব্যঞ্জক (আমি বুঝতে পারি এই উত্তরটি ২০০৯ সালের, সুতরাং এটি ভবিষ্যতের রেফারেন্সের জন্য কেবল একটি নোট))
মাইকেল 25

ধন্যবাদ (এবং বাহ, এত বছর পরে দ্রুত প্রতিক্রিয়া)। আমি এখন দেখি যে এই থ্রেড একটি "হয় আহবান হিসেবে আমার মূল অশুদ্ধ পাঠ উল্টোদিকে একটি সহজ সমাধান", " প্রদান করে একটি সহজ সমাধান।"
মাইকেল 25

@ মাইকেল_এন: প্রসারিত ... হুম, এখন আমি দেখতে পাচ্ছি যে পোস্টটি অনুরোধকৃত সমাধান সম্পর্কে ঠিক ছিল না, তবে এটি সমস্যাটি সম্পর্কে ছিল (এক্সওয়াই সমস্যা ক্ষেত্রে ধরে নেওয়া)।
জাকুব নারেবস্কি

হুঁ, বিচ্ছিন্ন মাথা দিয়ে উঁকি দেওয়া সহজ করা উচিত, বিশেষত এটি দরকারী তথ্যটি স্থিতিতে প্রদর্শিত হওয়া উচিত এবং কিছু প্রতিক্রিয়া সহ ওয়ার্কস্পেসকে দ্রুত এগিয়ে ফেলার জন্য অলওয়ে দেওয়া উচিত (যেমন টানা কমিটস)। তারপরে এটি কেবল পঠনযোগ্য স্থানীয় শাখাগুলির জন্য প্রতিস্থাপন হবে।
উপস্থাপিত

9

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

$ cat ~/bin/git/git-update-all
#!/bin/bash
# Update all local branches, checking out each branch in succession.
# Eventually returns to the original branch. Use "-n" for dry-run.
git_update_all() {
  local run br
  br=$(git name-rev --name-only HEAD 2>/dev/null)
  [ "$1" = "-n" ] && shift && run=echo

  for x in $( git branch | cut -c3- ) ; do
     $run git checkout $x && $run git pull --ff-only || return 2
  done

  [ ${#br} -gt 0 ] && $run git checkout "$br"
}

git_update_all "$@"

আপনি যদি এতে যুক্ত ~/bin/gitহন PATH(ফাইলটি ধরে নিচ্ছেন ~/bin/git/git-update-all) তবে আপনি চালাতে পারবেন:

$ git update-all

ধন্যবাদ! আপনি আমাকে বাশ দিয়ে খেলার এক ঘন্টা বাঁচিয়েছেন ...
8ctopus

5

যোগ এই স্ক্রিপ্টের জন্য .profileMac OS X এর উপর:

# Usage:
#   `git-pull-all` to pull all your local branches from origin
#   `git-pull-all remote` to pull all your local branches from a named remote

function git-pull-all() {
    START=$(git symbolic-ref --short -q HEAD);
    for branch in $(git branch | sed 's/^.//'); do
        git checkout $branch;
        git pull ${1:-origin} $branch || break;
    done;
    git checkout $START;
};

function git-push-all() {
    git push --all ${1:-origin};
};

1
এই স্ট্যাশগুলি প্রথমে সমস্ত পরিবর্তনগুলি পুনরায় পুনরুদ্ধার করা উচিত নয়?
মেল

5

এখানে একটি ভাল উত্তর: সমস্ত গিট শাখা আনতে কিভাবে

for remote in `git branch -r`; do git branch --track $remote; done
git pull --all

কেন আপনাকে যা করতে হবে ইঙ্গিত করা হয় git fetchএবং git pullমাত্র পরিবর্তে git pull?
সিন্ট্যাগমা

ধন্যবাদ। দেখে মনে হচ্ছে যে টানা সমস্ত প্রত্যন্ত থেকে সমস্ত শাখা নিয়ে আসে। এটি পরিবর্তিত হয়েছে
দুধভস্কি

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

এটি করা origin/উপসর্গের সাথে স্থানীয়ভাবে সমস্ত দূরবর্তী শাখা তৈরি করবে
ইয়াসাইন এলবাডাউই

3

একটি স্ক্রিপ্ট আমি আমার গিটব্যাশের জন্য লিখেছি । নিম্নলিখিত পূরণ করে:

  • ডিফল্টরূপে সমস্ত শাখাগুলির জন্য উত্স থেকে টানুন যা ট্র্যাকের উত্স সেটআপ করা হয়, আপনি যদি প্রয়োজন হয় একটি ভিন্ন দূরবর্তী নির্দিষ্ট করতে পারবেন।
  • আপনার বর্তমান শাখাটি যদি নোংরা অবস্থায় থাকে তবে এটি আপনার পরিবর্তনগুলিকে স্ট্যাশ করে এবং শেষে এই পরিবর্তনগুলি পুনরুদ্ধার করার চেষ্টা করবে।
  • প্রত্যন্ত শাখার ট্র্যাক করার জন্য স্থাপন করা প্রতিটি স্থানীয় শাখার জন্য:
    • git checkout branch
    • git pull origin
  • শেষ অবধি, আপনাকে আপনার মূল শাখায় ফিরিয়ে আনবে এবং রাষ্ট্র পুনরুদ্ধার করবে।

** আমি এটি ব্যবহার করি তবে পুরোপুরি পরীক্ষা করা হয়নি, নিজের ঝুঁকিতে ব্যবহার করি। এখানে একটি .বাশ_লিয়াস ফাইলটিতে এই স্ক্রিপ্টটির একটি উদাহরণ দেখুন ।

    # Do a pull on all branches that are tracking a remote branches, will from origin by default.
    # If current branch is dirty, will stash changes and reply after pull.
    # Usage: pullall [remoteName]
    alias pullall=pullAll
    function pullAll (){
     # if -h then show help
     if [[ $1 == '-h' ]]
    then
      echo "Description: Pulls new changes from upstream on all branches that are tracking remotes."
      echo 
      echo "Usage: "
      echo "- Default: pullall"
      echo "- Specify upstream to pull from: pullall [upstreamName]"
      echo "- Help: pull-all -h"
    else

     # default remote to origin
     remote="origin"
     if [ $1 != "" ]
     then
       remote=$1
     fi

     # list all branches that are tracking remote
     # git branch -vv : list branches with their upstreams
     # grep origin : keep only items that have upstream of origin
     # sed "s/^.."... : remove leading *
     # sed "s/^"..... : remove leading white spaces
     # cut -d" "..... : cut on spaces, take first item
     # cut -d splits on space, -f1 grabs first item
     branches=($(git branch -vv | grep $remote | sed "s/^[ *]*//" | sed "s/^[ /t]*//" | cut -d" " -f1))

     # get starting branch name
     startingBranch=$(git rev-parse --abbrev-ref HEAD)

     # get starting stash size
     startingStashSize=$(git stash list | wc -l)

     echo "Saving starting branch state: $startingBranch"
     git stash

     # get the new stash size
     newStashSize=$(git stash list | wc -l)

     # for each branch in the array of remote tracking branches
     for branch in ${branches[*]}
     do
       echo "Switching to $branch"
       git checkout $branch

       echo "Pulling $remote"
       git pull $remote

     done

     echo "Switching back to $startingBranch"
     git checkout $startingBranch

     # compare before and after stash size to see if anything was stashed
     if [ "$startingStashSize" -lt "$newStashSize" ]
     then
       echo "Restoring branch state"
       git stash pop
     fi
    fi
    }

আপনি কি সমান উইন্ডোজ ব্যাট ফাইল সরবরাহ করতে পারেন?
জাফি

1
@ জাফি আমার হাতে কতটা সময় আছে তা নিশ্চিত নন এবং আমি ব্যাচে খুব সাবলীল নই তবে আমি এটিকে যেতে পারি। আমি আমার অগ্রগতি এখানে পোস্ট করব , অন্যরা পদক্ষেপ নিতে এবং সহায়তা করতে পারে?
ফিলোসোফেল

3

আপনি যদি উইন্ডোজটিতে থাকেন তবে আপনি পাইগিটআপ ব্যবহার করতে পারেন যা git-upপাইথনের ক্লোন । ব্যবহার করে আপনি এটি ইনস্টল করতে পারেন পিপ সঙ্গে pip install --user git-upবা এর মাধ্যমে Scoop ব্যবহারscoop install git-up

[4]


3

সবেমাত্র একটি আপডেট উত্তর পোস্ট করছি। git-upআর রক্ষণাবেক্ষণ করা হয় না এবং আপনি যদি ডকুমেন্টেশনটি পড়ে থাকেন তবে তারা উল্লেখ করে যে কার্যকারিতা এখন গিটে উপলব্ধ

গিট ২.৯ হিসাবে, গিট টান --rebase --autostash মূলত একই জিনিসটি করে।

তদনুসারে, আপনি যদি গিট ২.৯ বা তার পরে আপডেট করেন তবে গিট-আপ ইনস্টল করার পরিবর্তে আপনি এই উপন্যাসটি ব্যবহার করতে পারেন:

git config --global alias.up 'pull --rebase --autostash'

আপনি git pullগিট ২.৯ এর জন্যও এটি সেট করতে পারেন (ধন্যবাদ @ ভনসি দয়া করে তার উত্তরটি এখানে দেখুন )

git config --global pull.rebase true
git config --global rebase.autoStash true

1
আপনার কোনও উপনামের দরকার নেই। : একটি সহজ Git টান যথেষ্ট, ডান কনফিগ সঙ্গে stackoverflow.com/a/40067353/6309
VonC

আউট গ্রেট কল ধন্যবাদ @VonC আমি আমার উত্তর আপডেট :) এছাড়াও করার জন্য একটি জনসংযোগ জমা পারে git-upডকুমেন্টেশন কারণ তারা যে উল্লেখ না
আগস্ট

এটি একবারে সমস্ত স্থানীয় শাখা আপডেট করে না, এজন্য আমি মূলত ব্যবহার করেছি git-up
রে

নথিপত্র আপডেট git-up:)
আগস্ট

3

আমি এই প্রশ্নের একই সমস্যা জুড়ে এসেছি ...

এ সম্পর্কে নিজেকে ভাবছি, আমি আমার .bashrcফাইলের অভ্যন্তরে একটি ছোট্ট ওরফে ফাংশন করেছি :

gitPullAll() {
    for branch in `git branch | sed -E 's/^\*/ /' | awk '{print $1}'`; do
        git checkout $branch
        git pull -p
        printf "\n"
    done
    echo "Done"
}

আমার জন্য কাজ করেছেন (:


2

যদি রেফ / হেড / মাস্টারকে রেফ / রিমোট / ফু / মাস্টারকে দ্রুত অগ্রসর করা যায় তবে এর ফলাফল

git merge-base refs/heads/master refs/remotes/foo/master

SHA1 আইডিটি ফিরিয়ে দেওয়া উচিত যা রেফ / হেড / মাস্টার পয়েন্ট করে। এটির সাহায্যে আপনি এমন স্ক্রিপ্ট একসাথে রাখতে পারেন যা সমস্ত স্থানীয় শাখাগুলিকে স্বয়ংক্রিয়ভাবে আপডেট করে যার কোনও ডাইভার্টিং কমিটস প্রয়োগ হয়নি।

এই ছোট্ট শেল স্ক্রিপ্ট (আমি এটাকে গিট-ক্যান-এফএফ বলেছি ) এটি কীভাবে করা যায় তা চিত্রিত করে।

#!/bin/sh

set -x

usage() {
    echo "usage: $(basename $0) <from-ref> <to-ref>" >&2
    exit 2
}

[ $# -ne 2 ] && usage

FROM_REF=$1
TO_REF=$2

FROM_HASH=$(git show-ref --hash $FROM_REF)
TO_HASH=$(git show-ref --hash $TO_REF)
BASE_HASH=$(git merge-base $FROM_REF $TO_REF)

if [ "$BASE_HASH" = "$FROM_HASH" -o \
     "$BASE_HASH" = "$FROM_REF" ]; then
    exit 0
else
    exit 1
fi

আপনি কি এই মন্তব্য দ্বারা বোঝাবেন?
পাহাড়

হিল্লুর পরামর্শ অনুযায়ী আমি নিজেই স্ক্রিপ্ট লিখতে সক্ষম নই, এবং গিট-মার্জ-বেস ব্যবহার করতে আমার গিট জ্ঞানের যথেষ্ট আত্মবিশ্বাস নেই।
নরম্যান রামসে

2
আমি ভয় করি যে এত ভালো দয়া করে সরবরাহ করা স্ক্রিপ্টটি কাজে লাগাতে আমি যথেষ্ট মডেলটি বুঝতে পারি না। কোনও ব্যক্তিকে পারদর্শী করতে চান তা যথেষ্ট।
নর্মন রামসে

আমি ব্যক্তিগতভাবে টম্মি ভার্টেনেনের নিবন্ধটি "কম্পিউটার বিজ্ঞানীদের জন্য গিট" গিটের মডেল এবং পরিভাষার সাথে পরিচিত হতে বেশ সহায়ক বলে মনে করি।
পাহাড়

2

ম্যাট কনলির উত্তরটি সম্পূর্ণ করার জন্য, শাখাটি পরীক্ষা না করেই স্থানীয় শাখার রেফারেন্সগুলি দ্রুত-ফরওয়ার্ড করা যায় এটি আপডেট করার একটি নিরাপদ উপায় way এটি এমন শাখাগুলি আপডেট করে না যা দ্রুতগঠিত হতে পারে না (অর্থাত্ যেগুলি ডাইভার্জ করা হয়েছে), এবং এটি বর্তমানে যা পরীক্ষা করা হয়েছে তা শাখাকে আপডেট করে না (কারণ তারপরে ওয়ার্কিং কপিটিও আপডেট করা উচিত)।

git fetch

head="$(git symbolic-ref HEAD)"
git for-each-ref --format="%(refname) %(upstream)" refs/heads | while read ref up; do
    if [ -n "$up" -a "$ref" != "$head" ]; then
        mine="$(git rev-parse "$ref")"
        theirs="$(git rev-parse "$up")"
        base="$(git merge-base "$ref" "$up")"
        if [ "$mine" != "$theirs" -a "$mine" == "$base" ]; then
            git update-ref "$ref" "$theirs"
        fi
    fi
done

2

কিছুটা আলাদা স্ক্রিপ্ট যা কেবল তাদের শাখাগুলির শাখাগুলির সাথে মেলে এমন শাখাগুলি দ্রুত-ফরওয়ার্ড করে। দ্রুত-ফরওয়ার্ড সম্ভব হলে এটি বর্তমান শাখাও আপডেট করে।

আপনার সমস্ত শাখার উজানের শাখা চালিয়ে সঠিকভাবে সেট করা আছে তা নিশ্চিত করুন git branch -vv। এর সাথে উজানের শাখা সেট করুনgit branch -u origin/yourbanchname

একটি ফাইল এবং chmod 755 অনুলিপি করুন:

#!/bin/sh

curbranch=$(git rev-parse --abbrev-ref HEAD)

for branch in $(git for-each-ref refs/heads --format="%(refname:short)"); do
        upbranch=$(git config --get branch.$branch.merge | sed 's:refs/heads/::');
        if [ "$branch" = "$upbranch" ]; then
                if [ "$branch" = "$curbranch" ]; then
                        echo Fast forwarding current branch $curbranch
                        git merge --ff-only origin/$upbranch
                else
                        echo Fast forwarding $branch with origin/$upbranch
                        git fetch . origin/$upbranch:$branch
                fi
        fi
done;

2

নিম্নলিখিত ওয়ান-লাইনার সমস্ত শাখাগুলি দ্রুত-ফরওয়ার্ড করে যদি সম্ভব হয় তবে একটি শাখা শাখা রয়েছে এবং অন্যথায় একটি ত্রুটি মুদ্রণ করে:

git branch \
  --format "%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)" |
  sh

এটা কিভাবে কাজ করে?

এটি git branchকমান্ড সহ একটি কাস্টম বিন্যাস ব্যবহার করে । প্রতিটি শাখার যে একটি প্রবাহ শাখা রয়েছে, এটি নীচের প্যাটার্ন সহ একটি লাইন মুদ্রণ করে:

git push . <remote-ref>:<branch>

এটিকে সরাসরি পাইপ করা যেতে পারে sh(ধরে নেওয়া উচিত যে শাখার নামগুলি সুগঠিত রয়েছে)। ছাড়ুন| sh কি করছে দেখার জন্য।

আদেশ সহকারে

ওয়ান-লাইনারটি আপনার রিমোটগুলিতে যোগাযোগ করবে না। এটি চালানোর আগে git fetchবা git fetch --allআগে ইস্যু করুন ।

বর্তমানে চেক-আউট শাখার মতো বার্তায় আপডেট করা হবে না

! [remote rejected] origin/master -> master (branch is currently checked out)

এই জন্য, আপনি নিয়মিত অবলম্বন করতে পারেন git pull --ff-only

উপনাম

নিম্নলিখিতটি আপনার যুক্ত করুন .gitconfigযাতে git fftএই আদেশটি সম্পাদন করে:

[alias]
        fft = !sh -c 'git branch --format \"%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)\" | sh' -

আমারও দেখুন .gitconfig। উপন্যাসটি "ফাস্ট-ফরোয়ার্ড ট্র্যাকিং (শাখা)" এর শর্টহ্যান্ড।


এই একটা চমৎকার সমাধান যদিও আমি ব্যবহার করা হবে soluction @John দ্বারা propsed এটা ভাল আউটপুট জন্য। hub
দিদিয়ের এল

এটি দ্রুত, সরল এবং আসলে কাজ করে! যদিও git pushআপনি যেটা প্রত্যাশা করবেন তার সম্পূর্ণ বিপরীতে আমি বিস্মিত হই । কি রহস্য?
ব্র্যান্ডনএলওয়াইট

@ ব্র্যান্ডনএলওয়াইট: আমি প্রশ্নটি বুঝতে পারি না। আপনি কি আশা করেন git push?
krlmlr

git pushশব্দার্থবিজ্ঞান আপলোড করেছে - স্থানীয়ভাবে আমার কিছু কমিট রয়েছে আমি প্রবাহে প্রেরণ করতে চাই। git pullশব্দার্থবিজ্ঞানের ডাউনলোড রয়েছে - আমি আমার স্থানীয় শাখায় কিছু প্রবাহের দূরবর্তী কমিটগুলি পেতে চাই। যেহেতু আমরা রিমোট থেকে লোকাল পর্যন্ত নতুন কমিট ডাউনলোড করার কথা বলছি, git pullতা স্পষ্ট পছন্দ। তবে না, এই কৌশলটি ব্যবহার করে git pushgit pushআমার স্থানীয় শাখায় দূরবর্তী পরিবর্তনগুলি কীভাবে টানবে ?!
ব্র্যান্ডনএলওয়াইট

git pushস্থানীয় শাখাগুলি আপডেট করার জন্যও এটি ব্যবহার করা যেতে পারে, যতক্ষণ না এটি দ্রুত অগ্রসর হওয়া আপডেট।
krlmlr

1

@Larmans এর স্ক্রিপ্টটি কিছুটা উন্নত হয়েছে:

#!/bin/sh

set -x
CURRENT=`git rev-parse --abbrev-ref HEAD`
git fetch --all
for branch in "$@"; do
  if ["$branch" -ne "$CURRENT"]; then
    git checkout "$branch" || exit 1
    git rebase "origin/$branch" || exit 1
  fi
done
git checkout "$CURRENT" || exit 1
git rebase "origin/$CURRENT" || exit 1

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

git pullসংস্করণ:

#!/bin/sh

set -x
CURRENT=`git rev-parse --abbrev-ref HEAD`
git fetch --all
for branch in "$@"; do
  if ["$branch" -ne "$CURRENT"]; then
    git checkout "$branch" || exit 1
    git pull || exit 1
  fi
done
git checkout "$CURRENT" || exit 1
git pull || exit 1

1

দেখে মনে হচ্ছে অন্য অনেকে একই সমাধানগুলিতে অবদান রেখেছিল, তবে আমি ভেবেছিলাম যে আমি কী নিয়ে এসেছি তা ভাগ করব এবং অন্যকে অবদানের জন্য আমন্ত্রণ জানাব। এই দ্রষ্টব্যটির একটি সুন্দর রঙিন আউটপুট রয়েছে, আপনি আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিটি কৌতূহলীভাবে পরিচালনা করেন এবং এটি দ্রুত কারণ এটি কোনও চেকআউট করে না, এবং আপনার ওয়ার্কিং ডিরেক্টরিটি কৌশলে ছেড়ে দেয়। এছাড়াও, এটি গিট ছাড়া অন্য কোনও নির্ভরতা ছাড়াই কেবল একটি শেল স্ক্রিপ্ট। (কেবলমাত্র ওএসএক্সে এখনও পরীক্ষিত)

#!/usr/bin/env bash

gitup(){    
RED='\033[33;31m'
YELLO='\033[33;33m'
GREEN='\033[33;32m'
NC='\033[0m' # No Color

HEAD=$(git rev-parse HEAD)
CHANGED=$(git status --porcelain | wc -l)

echo "Fetching..."
git fetch --all --prune &>/dev/null
for branch in `git for-each-ref --format='%(refname:short)' refs/heads`; do

    LOCAL=$(git rev-parse --quiet --verify $branch)
    if [ "$HEAD" = "$LOCAL" ] && [ $CHANGED -gt 0 ]; then
        echo -e "${YELLO}WORKING${NC}\t\t$branch"
    elif git rev-parse --verify --quiet $branch@{u}&>/dev/null; then
        REMOTE=$(git rev-parse --quiet --verify $branch@{u})
        BASE=$(git merge-base $branch $branch@{u})

        if [ "$LOCAL" = "$REMOTE" ]; then
           echo -e "${GREEN}OK${NC}\t\t$branch" 
        elif [ "$LOCAL" = "$BASE" ]; then
            if [ "$HEAD" = "$LOCAL" ]; then
                git merge $REMOTE&>/dev/null
            else
                git branch -f $branch $REMOTE
            fi
            echo -e "${GREEN}UPDATED${NC}\t\t$branch"
        elif [ "$REMOTE" = "$BASE" ]; then
            echo -e "${RED}AHEAD${NC}\t\t$branch"
        else
            echo -e "${RED}DIVERGED${NC}\t\t$branch"
        fi
    else
        echo -e "${RED}NO REMOTE${NC}\t$branch"
    fi
done
}

https://github.com/davestimpert/gitup

দুঃখিত, আমিও মনে করি উপরের অন্যান্য সরঞ্জামের মতো একই নামটি নিয়ে এসেছি।


2
আপনি কি এই লিখেছেন? যদি তা হয় তবে দয়া করে আপনার অধিভুক্তিটি প্রকাশ করুন অর্থাৎ আপনি কীভাবে এর সাথে সম্পর্কিত তা আমাদের বলুন। দয়া করে এই আরো পড়তে আরও তথ্যের জন্য। বিশেষত বলুন না - শো! ; আপনার স্ক্রিপ্টের কোন অংশগুলি এবং কীভাবে / কেন এটি সমস্যার সমাধান করে তা আমাদের জানান।
কেলে

1
হ্যাঁ আমি এটি লিখেছি। আমি আপনার .bashrc বা .zshrc- তে একটি অনুলিপি-পেস্টের জন্য উপরের উত্সটি অন্তর্ভুক্ত করেছি।
স্টিম্প

এটি একটি দুর্দান্ত সমাধান এবং ভালভাবে কাজ করে। কেউ নোটিশ নেননি?
ভিল

1

এটি নীচের স্ক্রিপ্টটি ব্যবহার করে করা যেতে পারে ... এটি প্রথমে সমস্ত শাখাগুলি আনবে এবং একে একে চেকআউট করবে এবং নিজেই আপডেট হবে।

#!/bin/bash
git branch -r | grep -v '\->' | while read remote; do git branch --track 
"${remote#origin/}" "$remote"; done

set -x
CURRENT=`git rev-parse --abbrev-ref HEAD`
git fetch --all
branch_name=$(git branch | awk '{print $1" "}' | grep -v '*' | xargs)
for branch in $branch_name; do
   git checkout "$branch" || exit 1
   git rebase "origin/$branch" || exit 1
   git pull origin $branch|| exit 1
done
git checkout "$CURRENT" || exit 1
git pull || exit 1

আপনার উত্তরটি স্কোর করার জন্য কিছু ব্যাখ্যা যুক্ত করুন
বোকা-দেব

1

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

সমস্ত শাখাকে নিরাপদে একটি লাইনের সাথে আপডেট করতে, আমি এখানে যা করছি:

git fetch --all && for branch in $(git branch | sed '/*/{$q;h;d};$G' | tr -d '*') ; do git checkout $branch && git merge --ff-only || break ; done
  • যদি এটি একটি শাখাকে দ্রুত-ফরওয়ার্ড করতে না পারে বা কোনও ত্রুটির মুখোমুখি হয় না, তবে এটি থামবে এবং আপনাকে সেই শাখায় ছেড়ে দেবে যাতে আপনি নিয়ন্ত্রণ ফিরে নিতে পারেন এবং ম্যানুয়ালি মার্জ করতে পারেন।

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

ব্যাখ্যা:

আরও ভাল পঠনযোগ্যতার জন্য এটি কয়েকটি লাইনে বিভক্ত হতে পারে:

git fetch --all && \
for branch in $(git branch | sed '/*/{$q;h;d};$G' | tr -d '*')
    do git checkout $branch && \
    git merge --ff-only || break
done
  1. git fetch --all && ... => সমস্ত রিমোট থেকে সমস্ত রেফারস এনে দেয় এবং কোনও ত্রুটি না থাকলে পরবর্তী কমান্ড দিয়ে চালিয়ে যান।

  2. git branch | sed '/*/{$q;h;d};$G' | tr -d '*'=> এর আউটপুট থেকে git branch, sedএকটি দিয়ে লাইনটি *এনে শেষ পর্যন্ত সরিয়ে দিন (যাতে বর্তমান শাখাটি সর্বশেষে আপডেট হবে)। তারপর trকেবল অপসারণ *

  3. for branch in $(...) ; do git checkout $branch && git merge --ff-only || break ; done=> পূর্ববর্তী কমান্ড থেকে প্রাপ্ত প্রতিটি শাখার নামের জন্য, এই শাখাটি চেকআউট করুন এবং দ্রুত-ফরওয়ার্ডের সাথে একত্রীকরণের চেষ্টা করুন। যদি এটি ব্যর্থ হয়, breakডাকা হয় এবং কমান্ডটি এখানেই বন্ধ হয়।

অবশ্যই, আপনি প্রতিস্থাপন করতে পারেন git merge --ff-onlyসঙ্গে git rebaseযদি তা না হয় আপনি যা চান তা।

অবশেষে, আপনি এটি আপনার বাশার্কে একটি নাম হিসাবে রাখতে পারেন :

alias git-pull-all='git fetch --all && for branch in $(git branch | sed '\''/*/{$q;h;d};$G'\'' | tr -d "*") ; do git checkout $branch && git merge --ff-only || break ; done'

অথবা যদি আপনি 'এবং' এর সাথে জগাখিচুড়ি করতে ভয় পান, বা আপনি কেবল আপনার সম্পাদকটিতে সিনট্যাক্টিক পাঠযোগ্যতা বজায় রাখতে পছন্দ করেন তবে আপনি এটিকে একটি ফাংশন হিসাবে ঘোষণা করতে পারেন:

git-pull-all()
{
    git fetch --all && for branch in $(git branch | sed '/*/{$q;h;d};$G' | tr -d '*') ; do git checkout $branch && git merge --ff-only || break ; done
}

বোনাস:

যারা এই sed '/*/{$q;h;d};$G'অংশে ব্যাখ্যাটি চান তাদের জন্য :

  • /*/=> একটি দিয়ে রেখাটি অনুসন্ধান করুন *

  • {$q => যদি এটি শেষ লাইনে থাকে তবে প্রস্থান করুন (আমাদের কিছু করার দরকার নেই কারণ বর্তমান শাখাটি ইতিমধ্যে তালিকার শেষটি রয়েছে)।

  • ;h;d} => অন্যথায়, হোল্ড বাফারে লাইনটি সংরক্ষণ করুন এবং এটি বর্তমান তালিকার অবস্থানে মুছুন।

  • ;$G => এটি শেষ লাইনে পৌঁছালে হোল্ডার বাফারের সামগ্রী যুক্ত করুন।


অবিরাম লাইনগুলির সমস্ত উন্মত্ততা এবং স্ক্রিপ্টের শীর্ষে &&সেট করে আপনি এড়াতে পারেন set -e
এমসপেল

0

"গিট টান - সমস্ত" কি আমার সমস্ত স্থানীয় শাখা আপডেট করতে পারে?

না এটা পারে না। দ্রুত-ফরওয়ার্ড করার জন্য, আমি এটি করার জন্য একটি ছোট সরঞ্জাম লিখেছি। https://github.com/changyuheng/git-fast-forward-all

এই সরঞ্জামের সুবিধা:

  1. একটি সংগ্রহস্থলে একাধিক রিমোট সমর্থন করে। ( hub syncএই মুহুর্তে একাধিক রিমোটগুলি সমর্থন করে না))
  2. স্থানীয় শাখায় এবং সংশ্লিষ্ট দূরবর্তী ট্র্যাকিং ব্রাঞ্চে বিভিন্ন নাম থাকার সমর্থন করে।
  3. অন্যান্য স্ক্রিপ্টগুলির চেয়ে অনেক দ্রুত যা প্রতিটি একক শাখার জন্য রিমোট আনতে পারে।
  4. কোনও ত্রুটি-প্রবণ রেজেক্স পার্সিং / সম্পাদনা নেই।

-1

গিট ২.৯ হিসাবে:

git pull --rebase --autostash

Https://git-scm.com/docs/git-rebase দেখুন

অপারেশন শুরুর আগে স্বয়ংক্রিয়ভাবে একটি অস্থায়ী স্ট্যাশ তৈরি করুন এবং অপারেশন শেষ হওয়ার পরে এটি প্রয়োগ করুন। এর অর্থ হ'ল আপনি কোনও নোংরা ওয়ার্কট্রিতে রিবেস চালাতে পারেন। তবে, যত্ন সহ ব্যবহার করুন: সফল রিবেসের পরে চূড়ান্ত স্ট্যাশ অ্যাপ্লিকেশনটির কারণে অ-তুচ্ছ সংঘাত হতে পারে।


-1

আসলে, গিট সহ version 1.8.3.1, এটি কাজ করে:

[root@test test]# git br
* master
  release/0.1
  update
[root@test test]# git pull --rebase
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From http://xxx/scm/csdx/test-git
   d32ca6d..2caa393  release/0.1 -> origin/release/0.1
Current branch master is up to date.
[root@test test]# git --version
git version 1.8.3.1

মাস্টার শাখায়, আপনি অন্যান্য সমস্ত শাখা আপডেট করতে পারেন। @Cascabel

আমি জানি না কোন সংস্করণটি এটি ভেঙে / ঠিক করে দেয়, ২.১17 এ (যা আমি ব্যবহার করি) এটি কাজ করতে পারে।

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